题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1126 题意:有下面这个式子:F1=1,F2=1.F[n]=(A*F[n-1]+B*F[n-2])%7 (n>=3) . 求给定A,B,N,求F[N]. 智障一样的找了一个小时:1.矩阵式n-2次方,2,F1=1,不是等于0啊。
#include<cstdio> #include<queue> #include<iostream> #include<vector> #include<map> #include<cstring> #include<string> #include<set> #include<stack> #include<algorithm> #define cle(a) memset(a,0,sizeof(a)) #define inf(a) memset(a,0x3f,sizeof(a)) #define ll long long #define Rep(i,a,n) for(int i=a;i<=n;i++) using namespace std; const int INF = ( 2e9 ) + 2; const int mod = 7; int c[2][2]; void mul(int e[][2],int a[][2],int b[][2]) { int t[2][2]; memset(t,0,sizeof(t)); for(int i=0;i<2;i++) for(int j=0;j<2;j++) for(int k=0;k<2;k++) t[i][j]=(t[i][j]+((a[i][k]*b[k][j])%mod+mod)%mod)%mod; for(int i=0;i<2;i++) for(int j=0;j<2;j++) e[i][j]=t[i][j]; return; } void qPow(int n) { int ret[2][2]; memset(ret,0,sizeof(ret)); for(int i=0;i<2;i++)ret[i][i]=1; while(n) { if(n&1) mul(ret,ret,c); mul(c,c,c); n>>=1; } for(int i=0;i<2;i++) for(int j=0;j<2;j++) c[i][j]=ret[i][j]; } int main() { int a,b,n; // freopen("in.txt","r",stdin); scanf("%d%d%d",&a,&b,&n); c[0][0]=0; c[0][1]=1; c[1][0]=b; c[1][1]=a; qPow(n-2); printf("%d\n",(c[1][1]+c[1][0])%mod); }