这道题是很简单的矩阵快速幂,可惜,在队内比赛时我不知什么时候抽风把模版中二分时判断的 ==1改成了==0 ,明明觉得自己想得没错,却一直过不了案例,唉,苦逼的比赛状态真让人抓狂!!!
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int num,mod; struct matrix { int a[4][4]; }; matrix multiply(matrix x,matrix y)//矩阵乘法 { matrix temp; for(int i=0;i<num;i++) { for(int j=0;j<num;j++) { int ans=0; for(int k=0;k<num;k++) { ans+=((x.a[i][k]*y.a[k][j])%mod); } temp.a[i][j]=ans%mod; } } return temp; } matrix calc(matrix origin ,matrix answ,int n)//n次矩阵快速幂 { while(n) { if(n%2==1)//原来比赛时一直是这里被我不小心改成了0,怪不得案例一直都过不了 answ=multiply(origin,answ); origin=multiply(origin,origin); n/=2; } return answ; } int main() { int a,b,n,c,t; scanf("%d",&t); for(int id=1;id<=t;id++) { num=4;mod=10007; scanf("%d%d%d%d",&n,&a,&b,&c); matrix origin={1,0,0,0, 0,0,1,0, 0,0,0,1, c,b,0,a}; matrix answ={1,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0}; answ=calc(origin,answ,n-2); printf("Case %d: %d ",id,answ.a[3][0]); } return 0; }