加了O2WA爆0,不加O2,AC了,求问为什么
#include <bits/stdc++.h>
using namespace std;
const int N=50;
int T,n;
const int MOD=1e9+7;
struct Mat{
int x,y;
long long a[N][N];
}ans,z;
Mat mul(Mat b1,Mat b2){
int n=b1.x,m=b2.y;
Mat ret;
ret.x=n,ret.y=m;
for(int i = 1 ; i<=n ; i++){
for(int j = 1 ; j<=m ; j++){
ret.a[i][j]=0;
for(int k = 1 ; k<=b1.y ; k++){
ret.a[i][j]+=b1.a[i][k]*b2.a[k][j];
ret.a[i][j]%=MOD;
}
}
}
return ret;
}
int main(){
cin>>T;
while(T--){
memset(z.a,0,sizeof(z.a));
memset(ans.a,0,sizeof(ans));
cin>>n;
ans.x=3,ans.y=1,z.x=z.y=3;
--n;
z.a[1][1]=z.a[1][3]=z.a[2][1]=z.a[3][2]=1;
for(int i = 1 ; i<=3 ; i++) ans.a[i][1]=1;
while(n){
if(n&1) ans=mul(ans,z);
z=mul(z,z);
n>>=1;
}
cout<<ans.a[3][1]<<endl;
}
return 0;
}