#include<bits/stdc++.h>
using namespace std;
struct matrix{
long long h,l;//h代表行,l代表列
int a[110][110];
}ans,wns;
long long n,m;
int mod=30011;
matrix times(matrix r,matrix c){
matrix timesans;
memset(timesans.a,0,sizeof(timesans.a));
timesans.h=r.h;
timesans.l=c.l;
for(int i=1;i<=r.h;i++){
for(int j=1;j<=c.l;j++){
for(int q=1;q<=r.l;q++){
timesans.a[i][j]=(timesans.a[i][j]+r.a[i][q]%mod*c.a[q][j]%mod)%mod;
}
}
}
return timesans;
}
matrix mul(matrix x,long long y){
matrix res;
res.h=res.l=x.l;
memset(res.a,0,sizeof(res.a));
for(int i=1;i<=res.l;i++){
res.a[i][i]=1;
}
for(;y;y>>=1){
if(y&1) res=times(x,res);
x=times(x,x);
}
return res;
}
matrix buildansup4(long long n){
matrix temp;
memset(temp.a,0,sizeof(temp.a));
temp.h=1;
temp.l=2*n;
temp.a[1][1]=5;
temp.a[1][2]=6;
temp.a[1][3]=3;
temp.a[1][4]=1;
temp.a[1][n+1]=2;
temp.a[1][n+2]=2;
temp.a[1][n+3]=1;
return temp;
}
matrix buildans3(){
matrix temp;
memset(temp.a,0,sizeof(temp.a));
temp.h=1;
temp.l=6;
temp.a[1][1]=5;
temp.a[1][2]=6;
temp.a[1][3]=3;
temp.a[1][4]=2;
temp.a[1][5]=2;
temp.a[1][6]=1;
return temp;
}
matrix buildans2(){
matrix temp;
memset(temp.a,0,sizeof(temp.a));
temp.h=1;
temp.l=4;
temp.a[1][1]=5;
temp.a[1][2]=5;
temp.a[1][3]=2;
temp.a[1][4]=2;
return temp;
}
matrix buildans1(){
matrix temp;
memset(temp.a,0,sizeof(temp.a));
temp.h=1;
temp.l=2;
temp.a[1][1]=2;
temp.a[1][2]=1;
return temp;
}
matrix buildwns(long long n){
matrix temp;
temp.l=temp.h=2*n;
memset(temp.a,0,sizeof(temp.a));
for(int i=1;i<=n;i++){
temp.a[i][i]=1;
if(i-1>=1){
temp.a[i][i-1]=1;
}
if(i+1<=n){
temp.a[i][i+1]=1;
}
}
for(int i=1;i<=n;i++){
temp.a[i][n+i]=1;
}
for(int i=n+1;i<=2*n;i++){
temp.a[i][i-n]=1;
}
return temp;
}
void printmatrix(matrix p){
for(int i=1;i<=p.h;i++){
for(int j=1;j<=p.l;j++){
cout<<p.a[i][j]<<" ";
}
cout<<endl;
}
}
int main(){
cin>>n>>m;
if(m<=4){
if(m==4){
if(n==1){
cout<<5;
return 0;
}
if(n==2){
cout<<6;
return 0;
}
if(n==3){
cout<<3;
return 0;
}
if(n==4){
cout<<1;
return 0;
}
}
if(m==3){
if(n==1){
cout<<2;
return 0;
}
if(n==2){
cout<<2;
return 0;
}
if(n==3){
cout<<1;
return 0;
}
}
if(m==2){
if(n==1){
cout<<1;
return 0;
}
if(n==2){
cout<<1;
return 0;
}
}
if(m==1){
if(n==1){
cout<<1;
return 0;
}
}
cout<<0;
return 0;
}
if(n>=4){
ans=buildansup4(n);
}
if(n==3){
ans=buildans3();
}
if(n==2){
ans=buildans2();
}
if(n==1){
ans=buildans1();
}
wns=buildwns(n);
// printmatrix(wns);
// system("pause");
wns=mul(wns,m-4);
ans=times(ans,wns);
printf("%lld",ans.a[1][n]%mod);
// printmatrix(ans);
return 0;
}
代码第5行和第8行如果改为long long就会第11个点TLE但是开int就A了,求大佬帮忙看看