其实呢,自己乱测试数据也是会发现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
}//也对
以后矩阵快速幂用这个自己写的吧....