hdu 1005 简单题

   今早水出的第一道题,带着情绪做的,竟然1Y了,确实惊奇。这道简单的线性递推取模,直接递推是不行的,因为n的规模达到了100,000,000,要么超时要么超内存。可以用矩阵快速幂来搞,根据题意构建出对应的矩阵后即可(第一次写的,用结构体来进行矩阵相乘运算),代码如下:

 #include<cstdio>

 struct matrix{
int a,b,c,d;
matrix(int _a=, int _b=, int _c=, int _d=) {
a=_a; b=_b; c=_c; d=_d;
}
matrix operator *(const matrix &m2){
return matrix((a*m2.a%+b*m2.c%)%, (a*m2.b%+b*m2.d%)%, (c*m2.a%+d*m2.c%)%, (c*m2.b%+d*m2.d%)%);
}
matrix square(){
return matrix((a*a%+b*c%)%, b*(a+d)%, c*(a+d)%, (b*c%+d*d%)%);
}
}; int calcu(matrix m, int p)
{
matrix ans(,,,);
while(p){
if(p&) ans= ans*m;
m= m.square();
p>>=;
}
return (ans.a+ans.c)%;
} int main()
{
int a,b,n;
while(scanf("%d%d%d",&a,&b,&n),a){
if(n<=) puts("");
else printf("%d\n", calcu(matrix(a,,b,),n-));
}
return ;
}

  实际上,这道题还有更优的做法,就是找循环周期,因为f[n]只与前两个有关,而且是模7,所以它的循环周期是7*7-1=48(为何这样算我也不知如何证明,留待以后再想),下面也附上AC代码:

 #include<cstdio>
int f[]= {,,}; int main()
{
int a,b,n,i;
while(scanf("%d%d%d",&a,&b,&n), a){
for(i=; i<=; ++i)
f[i]= (a*f[i-]+b*f[i-])%;
f[]= f[];
printf("%d\n",f[n%]);
}
return ;
}
上一篇:POJ 2586 Y2K Accounting Bug(枚举大水题)


下一篇:Logger日志级别说明及设置方法、说明 (zhuan)