今天做了一套题的F题,因为long long问题一直wa,wa到炸,哎,经过这次,印象真的挺深刻的了。。。
错误代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const long long mod=1e9+7;
struct node{
ll pp[5][5];
};
int f=2;
node q(node a,node b)
{
node ans;
memset(ans.pp,0,sizeof(ans.pp));
for(int i=1;i<=f;i++)
for(int j=1;j<=f;j++)
for(int k=1;k<=f;k++)
{
ans.pp[i][j]=(ans.pp[i][j]+(a.pp[i][k]*b.pp[k][j])%mod)%mod;
}
return ans;
}
node p(node aa,int nn)
{
node res;
memset(res.pp,0,sizeof(res.pp));
for(int i=1;i<=f;i++)res.pp[i][i]=1;
while(nn){
if(nn&1)res=q(res,aa);
nn>>=1;
aa=q(aa,aa);
}
return res;
}
int main()
{
node a;
memset(a.pp,0,sizeof(a.pp));
a.pp[1][1]=1;a.pp[1][2]=1;
a.pp[2][1]=1;
node b;
memset(b.pp,0,sizeof(b.pp));
b.pp[1][1]=2;
b.pp[2][1]=1;
ll t;
cin>>t;
if(t<=2){
printf("%lld\n",t);
return 0;
}
node anss=p(a,t-2);
anss=q(anss,b);
printf("%lld\n",anss.pp[1][1]);
return 0;
}
正确代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const long long mod=1e9+7;
struct node{
ll pp[5][5];
};
int f=2;
node q(node a,node b)
{
node ans;
memset(ans.pp,0,sizeof(ans.pp));
for(int i=1;i<=f;i++)
for(int j=1;j<=f;j++)
for(int k=1;k<=f;k++)
{
ans.pp[i][j]=(ans.pp[i][j]+(a.pp[i][k]*b.pp[k][j])%mod)%mod;
}
return ans;
}
node p(node aa,ll nn)
{
node res;
memset(res.pp,0,sizeof(res.pp));
for(int i=1;i<=f;i++)res.pp[i][i]=1;
while(nn){
if(nn&1)res=q(res,aa);
nn>>=1;
aa=q(aa,aa);
}
return res;
}
int main()
{
node a;
memset(a.pp,0,sizeof(a.pp));
a.pp[1][1]=1;a.pp[1][2]=1;
a.pp[2][1]=1;
node b;
memset(b.pp,0,sizeof(b.pp));
b.pp[1][1]=2;
b.pp[2][1]=1;
ll t;
cin>>t;
if(t<=2){
printf("%lld\n",t);
return 0;
}
node anss=p(a,t-2);
anss=q(anss,b);
printf("%lld\n",anss.pp[1][1]);
return 0;
}
你可以找到不同吗?
真的是。。。。
写这个一个是为了自己以后不要再犯类似的错误,另一个是希望看到此条博客的你也能避免这个错误。。。嗯,我是一个新手,勿喷。。
不同就是
node p(node aa,int nn)
和
node p(node aa,ll nn)
眼力不行,溜了溜了,我要去配眼镜了。。。