Formula
A [1] = 2
A [n] = 2 * A [n-1] + 2 ^ (n-2)
Here N is n-k in the question
When K> N outputs 0
K = N output 1
N-k is equal to 1, because 2 ^ (n-2) This is 1/2 bad representation
Matrix used for quick power
[2, 2] [A [2] ([0, 2]) ^ (n-k-2) * [1] to get the first element of the column vector is the desired a [n ];
This recursion can directly use the Matrix to quickly power fruit...
Partition
Time Limit: 2000/1000 MS (Java/others) memory limit: 32768/32768 K (Java/Others)
Total submission (s): 349 accepted submission (s): 168
Problem descriptiondefine F (n) as the number of ways to perform n in format of the sum of some positive integers. For instance, when n = 4, we have
4 = 1 + 1 + 1 + 1
4 = 1 + 1 + 2
4 = 1 + 2 + 1
4 = 2 + 1 + 1
4 = 1 + 3
4 = 2 + 2
4 = 3 + 1
4 = 4
Totally 8 ways. Actually, we will have f (n) = 2 (n-1) after observations.
Given a pair of integers N and K, your task is to figure out how many times that the integer k occurs in such 2 (n-1) ways. in the example above, number 1 occurs for 12 times, while number 4 only occurs once.
Inputthe first line contains a single integer T (1 ≤ T ≤ 10000), indicating the number of test cases.
Each test case contains two integers N and K (1 ≤ n, k ≤109 ).
Outputoutput the required answer modulo 109 + 7 for each test case, one per line.
Sample Input
24 25 5
Sample output
51
#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<algorithm>#include<cstdlib>#define MAXN 20#define MOD 1000000007using namespace std;struct Matrix{ int size; long long element[MAXN][MAXN]; void setSize(int); Matrix operator* (Matrix); Matrix power(int);};void Matrix::setSize(int a){ for (int i=0; i<a; i++) for (int j=0; j<a; j++) element[i][j]=0; size = a;}Matrix Matrix::operator* (Matrix param){ Matrix product; product.setSize(size); for (int i=0; i<size; i++) for (int j=0; j<size; j++) for (int k=0; k<size; k++) product.element[i][j]=(1LL*element[i][k]*param.element[k][j]+product.element[i][j])%MOD; return product;}Matrix Matrix::power(int exp){ Matrix res,A; A=*this; res.setSize(size); for(int i=0;i<size;i++) res.element[i][i]=1; while(exp) { if(exp&1) res=res*A; exp>>=1; A=A*A; } return res;}Matrix a,b;int bas=2;int main(){ int cs; cin>>cs; a.setSize(2); a.element[1][1]=a.element[0][0]=a.element[0][1]=2; a.element[1][0]=0; while(cs--) { int n,k; cin>>n>>k; if(k>n) printf("0\n"); else if(k==n) printf("1\n"); else { n=n-k; if(n==1) printf("2\n"); else { b=a.power(n-2); int mm[]={5,1}; long long ans=0; for(int k=0;k<2;k++) ans=(ans+1LL*b.element[0][k]*mm[k])%MOD; cout<<ans<<endl; } } } return 0;}