题解:广义斐波那契数列 矩阵乘法
#include<iostream> #include<cstdio> #include<cstring> #define LL long long using namespace std; LL n,A,B; inline LL read(){ char ch=getchar();LL x=0,f=1; for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-1; for(;isdigit(ch);ch=getchar())x=x*10+ch-'0'; return x*f; } struct maxtix{ int t[5][5]; }ans; maxtix maxtix_mul(maxtix a,maxtix b){ maxtix tmp; for(int i=1;i<=4;i++){ for(int j=1;j<=4;j++){ tmp.t[i][j]=0; for(int k=1;k<=4;k++){ tmp.t[i][j]=(tmp.t[i][j]%7+a.t[i][k]*b.t[k][j]%7)%7; } } } return tmp; } maxtix maxtix_mul(maxtix a,LL b){ maxtix ret=a;b--; while(b){ if(b&1)ret=maxtix_mul(ret,a); a=maxtix_mul(a,a); b>>=1; } return ret; } int main(){ freopen("attack.in","r",stdin); freopen("attack.out","w",stdout); A=read();B=read();n=read(); A%=7;B%=7; if(n<=1000000){ LL f1=1,f2=1,f3; for(int i=3;i<=n;i++){ f3=(A*f2+B*f1)%7; f1=f2;f2=f3; } printf("%lld\n",f2); fclose(stdin);fclose(stdout); return 0; } ans.t[1][1]=0;ans.t[1][2]=B;ans.t[2][1]=1;ans.t[2][2]=A; ans=maxtix_mul(ans,n-2); printf("%d\n",(ans.t[1][2]+ans.t[2][2])%7); fclose(stdin);fclose(stdout); return 0; }