以下是我的AC代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
int mod=1000000007;
struct mat{
int li[105][105];
};
mat ma;
int n=3,p;
mat operator *( mat x, mat y){
mat z;
memset(z.li,0,sizeof(z.li));
for(int k=1;k<=n;++k)
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
z.li[i][j]=(z.li[i][j]+x.li[i][k]*y.li[k][j]%mod)%mod;
return z;
}
void print(mat x){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cout<<x.li[i][j]<<" ";
}
cout<<endl;
}
}
mat qp(mat x,int p){
mat ans=x;
int q=p;
while(q){
if(q%2){
ans=ans*x;
}
q/=2;
x=x*x;
}
return ans;
}
signed main(){
int t;
cin>>t;
while(t--){
cin>>p;
int q=p;
memset(ma.li,0,sizeof(ma.li));
int lis[4][4]={{0,0,0,0},{0,1,1,1},{0,0,1,1},{0,1,1,2}};
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)ma.li[i][j]=lis[i][j];
}
mat ma2=qp(ma,(p-1)/3);
int a,b,c;
// print(ma2);
if(q%3==1)cout<<ma2.li[1][1]<<endl;
if(q%3==2)cout<<ma2.li[1][2]<<endl;
if(q%3==0)cout<<ma2.li[1][3]<<endl;
}
}
注意
memset(z.li,0,sizeof(z.li));
这一行.
请问为什么呢?? (蒟蒻SOS,SOS......)