hdu 4602 Partition(快速幂)

时间:2023-03-09 21:46:34
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

第一次写矩阵就不献丑了

 #include<stdio.h>

 const int mod=1e9+;

 #define LL __int64

 LL p[][];
LL q[][]; LL bb(LL a,LL b,LL c,LL d)
{
return (a*c%mod+b*d%mod)%mod;
} LL aa(int n)
{
LL a,b,c,d;
LL x,y;
p[][]=;
p[][]=;
p[][]=;
p[][]=; q[][]=;
q[][]=;
while(n)
{
a=p[][];b=p[][];c=p[][];d=p[][];
x=q[][];y=q[][];
if(n&){
q[][]=bb(x,y,a,c);
q[][]=bb(x,y,b,d);
}
p[][]=bb(a,b,a,c);
p[][]=bb(a,b,b,d);
p[][]=bb(c,d,a,c);
p[][]=bb(c,d,b,d); n>>=;
}
return (q[][]%mod);
} int main()
{
int T,n,m;
scanf("%d",&T); while(T--)
{
scanf("%d%d",&n,&m);
if(n<m)
printf("0\n");
else if(n-m==)
printf("1\n");
else if(n-m==)
printf("2\n");
else
printf("%I64d\n",aa(n-m-));
}
return ;
}