第一次做是看了大牛的找规律结果,如下:
//显然我看了答案,循环节点是48,但是为什么是48,据说是高手打表出来的 #include<stdio.h> int main() { int f[50],a,b,i,n; f[1]=1;f[2]=1; while(scanf("%d%d%d",&a,&b,&n)!=EOF) { if(a==0&&b==0&&n==0)break; for(i=3;i<49;i++) { f[i]=(a*f[i-1])%7+(b*f[i-2])%7; } printf("%d ",f[n%48]%7); } return 0; }
第二次做是学了矩阵快速幂,这是经典的矩阵快速幂简单题
//简单的矩阵快速幂 //f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7. //注意origin矩阵中的第二行的a和b的位置摆放 #include<stdio.h> #include<string.h> int num=2,mod=7; struct matrix { int a[2][2]; }; matrix multiply(matrix x,matrix y)//矩阵乘法 { matrix temp; memset(temp.a,0,sizeof(temp.a)); for(int i=0;i<num;i++) { for(int k=0;k<num;k++) { for(int j=0;j<num;j++) { temp.a[i][j]=(temp.a[i][j]+x.a[i][k]*y.a[k][j])%mod; } } } return temp; } matrix calc(matrix a,int n)//矩阵快速幂——a^n { if(n==1)return a; matrix e; for(int i=0;i<num;i++) for(int j=0;j<num;j++) e.a[i][j]=(i==j); while(n) { if(n&1) e=multiply(e,a); n>>=1; a=multiply(a,a); } return e; } int main() { int n,a,b; while(scanf("%d%d%d",&a,&b,&n)!=EOF) { if(a==0&&b==0&&n==0)break; matrix origin= {0,1}; origin.a[1][0]=b;origin.a[1][1]=a; matrix answ={1,0, 1,0}; if(n>2) answ=multiply(calc(origin,n-2),answ); printf("%d ",answ.a[1][0]); } return 0; }