A number sequence is defined as follows:
f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.
Given A, B, and n, you are to calculate the value of f(n).
f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.
Given A, B, and n, you are to calculate the value of f(n).
1 1 3 1 2 10 0 0 0
25
法一:想到的为矩阵快速幂求斐波那契数列
#include <cstdio> #include <cstring> #include <iostream> using namespace std; struct node{ int mat[2][2]; }; struct node Cal(struct node a,struct node b){ struct node te; memset(te.mat,0,sizeof(te.mat)); for(int i=0;i<2;i++){ for(int j=0;j<2;j++){ if(a.mat[i][j]){ for(int t=0;t<2;t++){ te.mat[i][t]=(te.mat[i][t]+a.mat[i][j]*b.mat[j][t])%7; } } } } return te; } struct node Quick(struct node a,int n){ if(n==1){ return a; } struct node e; memset(e.mat,0,sizeof(e.mat)); for(int i=0;i<2;i++){ e.mat[i][i]=1; } if(n==0){ return e; } while(n){ if(n&1){ e=Cal(a,e); } a=Cal(a,a); n=n>>1; } return e; } int main(){ int a,b,n; struct node re; while(scanf("%d%d%d",&a,&b,&n)!=EOF){ if(!a&&!b&&!n){ break; } re.mat[0][0]=0; re.mat[0][1]=1; re.mat[1][0]=b; re.mat[1][1]=a; re=Quick(re,n-1); cout<<(re.mat[0][0]+re.mat[0][1])%7<<endl; } return 0; }
//法二:思维,试着去找循环节#include <cstdio> #include <cstring> #include <iostream> using namespace std; int main(){ int i,a,b,n,cot; int f[10000]; while(scanf("%d%d%d",&a,&b,&n)!=EOF&&a&&b&&n){ f[1]=f[2]=1; for(i=3;i<10000;i++){ f[i]=(a*f[i-1]+b*f[i-2])%7; if(f[i]==1&&f[i-1]==1){ break; } } cot=i-2; f[0]=f[cot]; cout<<f[n%cot]%7<<endl; } return 0; }