其实呢,自己乱测试数据也是会发现BUG的
一直都会是自己的代码错误!
折腾了我一大晚上到头来竟然矩阵数组的存储也是long long类型
不过终归是解决了 稍微学到一点教训吧
一个是写完代码 自己可以代几组数据试一下 有时候会出现那种很明显的错误 比如这个题出现负数神马啦
再一个经验是Long long 真的比int 好用??
自己的程序几乎每个地方都可能超出范围
再最后是简单的程序也要多练 现在 自己敲一遍矩阵的乘法
#include<stdio.h> #include<string.h> #define da 100000007 struct M { long long s[3][3]; }; struct M multiply(struct M a,struct M b){ struct M c; memset(c.s,0,sizeof(c.s)); for(int i=0;i<3;i++) for(int j=0;j<3;j++) for(int k=0;k<3;k++) c.s[i][j]=(c.s[i][j]+(a.s[i][k]*b.s[k][j])%da)%da; return c; } struct M paw(struct M a,long long t){ if(t==1) return a; else{ struct M b=paw(a,t/2); if(t&1){ return multiply(multiply(b,b),a); } else return multiply(b,b); } } int main() { struct M a,c; a.s[0][0]=3;a.s[0][1]=2;a.s[0][2]=1; a.s[1][0]=1;a.s[1][1]=0;a.s[1][2]=0; a.s[2][0]=0;a.s[2][1]=1;a.s[2][2]=0; int a1,a2,a3; long long n; while(scanf("%d%d%d%lld",&a1,&a2,&a3,&n)!=EOF) { if(n==0) { printf("%d\n",a1%da);} else if(n==1) {printf("%d\n",a2%da);} else if(n==2) { printf("%d\n",a3%da);} else{ c=paw(a,n-2); long long x=(c.s[0][0]*(a3%da)+c.s[0][1]*(a2%da)+c.s[0][2]*(a1%da))%da; printf("%lld\n",x); } } return 0; }
按位与“&”功能强大?
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
for(int k=0;k<N;k++)
{c.s[i][j]+=(a.s[i][k]%da)*(b.s[k][j]%da);
c.s[i][j]%=da;//因为各对应行列为i,j
}//也对
以后矩阵快速幂用这个自己写的吧....