RT,用的是矩阵快速幂优化递推,递推式是 f(i,j)=f(i−1,j−1)+f(i,j−1)+f(i+1,j−1)+f(i,j−2)。其他点都过了,不知道为啥WA on #6,对拍也没拍出来QAQ
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#define pb push_back
#define sml(x,y) (x=min(x,y))
#define big(x,y) (x=max(x,y))
#define ll long long
#define fo(i,x,y) for(register int i=x;i<=y;++i)
#define go(i,x,y) for(register int i=x;i>=y;--i)
using namespace std;
inline int read(){int x=0,fh=1; char ch=getchar(); while(!isdigit(ch)){if(ch=='-') fh=-1; ch=getchar();} while(isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0'; ch=getchar();} return x*fh;}
const int N=105,qlr=30011;
struct Mat{
int n,m;
int a[N][N];
Mat(){memset(a,0,sizeof a);}
void zero(){fo(i,1,n) fo(j,1,m) a[i][j]=0;n=m=0;}
Mat operator*(const Mat&x)const{
Mat ret;ret.n=n,ret.m=x.m;
fo(i,1,ret.n)
fo(j,1,ret.m)
fo(k,1,m) ret.a[i][j]=(ret.a[i][j]+a[i][k]*x.a[k][j])%qlr;
return ret;
}
}I,T,A,B;
Mat ksm(Mat &x,int y){
if(y==1) return x;
T=ksm(x,y/2);
T=T*T;
if(y&1) T=T*x;
return T;
}
int main(){
int n,m;cin>>n>>m;
if(n>m){
cout<<0;
return 0;
}
if(m<=2){
cout<<1;
return 0;
}
A.n=B.n=B.m=2*n;A.m=A.a[n+1][1]=A.a[n+2][1]=1;
fo(i,1,n) B.a[i][i+n]=1;
fo(i,n+1,2*n) B.a[i][i-n]=B.a[i][i]=B.a[i][i-1]=B.a[i][i+1]=1;
B.a[n+1][n]=0;
B=ksm(B,m-2);
A=B*A;
cout<<A.a[2*n][1];
return 0;
}