hdu 4602 Partition(快速幂)
推公式+快速幂
公式有很多形式,可以写矩阵
1、前n-1项和的两倍+2的(n-2)次方,这个写不出啥
2、递推式:f(n)=2*f(n-1)+2的(n-3)次方
3、公式:2的(n-k-2)次方*(n-k+1)+2的(n-k-1)
代码什么的看他的吧http://blog.csdn.net/liuledidai/article/details/9449301
第一次写矩阵就不献丑了
1 #include<stdio.h> 2 3 const int mod=1e9+7; 4 5 #define LL __int64 6 7 LL p[2][2]; 8 LL q[1][2]; 9 10 LL bb(LL a,LL b,LL c,LL d) 11 { 12 return (a*c%mod+b*d%mod)%mod; 13 } 14 15 LL aa(int n) 16 { 17 LL a,b,c,d; 18 LL x,y; 19 p[0][0]=2; 20 p[0][1]=0; 21 p[1][0]=1; 22 p[1][1]=2; 23 24 q[0][0]=2; 25 q[0][1]=1; 26 while(n) 27 { 28 a=p[0][0];b=p[0][1];c=p[1][0];d=p[1][1]; 29 x=q[0][0];y=q[0][1]; 30 if(n&1){ 31 q[0][0]=bb(x,y,a,c); 32 q[0][1]=bb(x,y,b,d); 33 } 34 p[0][0]=bb(a,b,a,c); 35 p[0][1]=bb(a,b,b,d); 36 p[1][0]=bb(c,d,a,c); 37 p[1][1]=bb(c,d,b,d); 38 39 n>>=1; 40 } 41 return (q[0][0]%mod); 42 } 43 44 int main() 45 { 46 int T,n,m; 47 scanf("%d",&T); 48 49 while(T--) 50 { 51 scanf("%d%d",&n,&m); 52 if(n<m) 53 printf("0\n"); 54 else if(n-m==0) 55 printf("1\n"); 56 else if(n-m==1) 57 printf("2\n"); 58 else 59 printf("%I64d\n",aa(n-m-1)); 60 } 61 return 0; 62 }