公式
a[1]=2
a[n]=2*a[n-1]+2^(n-2)
这里n为题目中n-k
当k>n输出0
k==n输出1
n-k等于1的时候特判一下因为 2^(n-2)这项为1/2不好表示
用于快速幂的矩阵式
[ 2 ,2 ] [ a[2]]
( [ 0 ,2 ] )^(n-k-2) *[ 1 ] 得出列向量第一个元素就是所求的a【n】;
这种递推可以直接用矩阵快速幂水果。。。
Partition
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 349 Accepted Submission(s): 168
Problem Description
Define 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.
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.
Input
The 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≤10 9).
Each test case contains two integers n and k(1≤n,k≤10 9).
Output
Output the required answer modulo 10
9+7 for each test case, one per line.
Sample Input
2 4 2 5 5
Sample Output
5 1
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cstdlib>
#define MAXN 20
#define MOD 1000000007
using 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;
}