H H H有6种情况,先打表列出来,再对 W W W进行操作
Code:
#include<bits/stdc++.h>
#define mod 998244353
#define ll long long
using namespace std;
ll mat[1<<6][1<<6],tmp2[1<<6][1<<6],dp[7],ans[1<<6],tmp[1<<6],h,t,now,w;
void wer(ll x){
while(x){
if(x&1){
for(int i=0;i<(1<<h);i++)
tmp[i]=0;
for(int i=0;i<(1<<h);i++)
for(int j=0;j<(1<<h);j++)
tmp[i]=(tmp[i]+1LL*ans[j]*mat[j][i]%mod)%mod;
for(int i=0;i<(1<<h);i++)
ans[i]=tmp[i];
}
for(int i=0;i<(1<<h);i++)
for(int j=0;j<(1<<h);j++)
tmp2[i][j]=0;
for(int i=0;i<(1<<h);i++)
for(int j=0;j<(1<<h);j++)
for(int k=0;k<(1<<h);k++)
tmp2[i][j]=(tmp2[i][j]+1LL*mat[i][k]*mat[k][j]%mod)%mod;
for(int i=0;i<(1<<h);i++)
for(int j=0;j<(1<<h);j++)
mat[i][j]=tmp2[i][j];
x>>=1;
}
}
int main(){
cin>>h>>w;
dp[0]=1,dp[1]=1;
for(int i=2;i<=h;i++)
dp[i]=(dp[i-1]+dp[i-2])%mod;
for(int i=0;i<(1<<h);i++)
for(int j=0;j<(1<<h);j++){
if((i|j)!=(1<<h)-1)continue;
mat[j][i]=1,now=0,t=(i&j);
for(int k=0;k<h;k++)
if(t&(1<<k))now++;
else mat[j][i]=1LL*mat[j][i]*dp[now]%mod,now=0;
mat[j][i]=1LL*mat[j][i]*dp[now]%mod;
}
ans[(1<<h)-1]=1,wer(w);
printf("%d\n",ans[(1<<h)-1]);
}