#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<ctime> usingnamespacestd; #define ll long long #define il inline #define rg register const ll mod=998244353; structmatrix{ ll a[210][210]; voidclr(){ memset(a,0,sizeof(a)); } }u,v,ed; ll n,x,ans; int a_id[132000],tot; int num[20]; int p; il matrix unit(){ matrix tmp; tmp.clr(); for (rg int i=1;i<=200;++i) tmp.a[i][i]=1; return tmp; } il matrix operator * (matrix aa,matrix bb){ matrix tmp; tmp.clr(); for (rg int k=1;k<=tot;++k){ for (rg int i=1;i<=tot;++i){ for (rg int j=1;j<=tot;++j){ tmp.a[i][j]=((tmp.a[i][j]+aa.a[i][k]*bb.a[k][j]))%mod; } } } return tmp; } il matrix ksm(matrix u,ll t){ matrix tmp=unit(); while (t){ if (t&1) tmp=tmp*u; u=u*u; t>>=1; } return tmp; } il voidcheck(int tmp){ int xx=tmp; p=0; memset(num,false,sizeof(num)); while (tmp){ ++p; if (tmp&1) num[p]=true; tmp>>=1; } for (rg int i=2;i<=x;++i) if (num[i]&&num[i-1]) return; if (num[x]&&num[1]) return; a_id[++tot]=xx; //s[xx]=1; } il voidlink(){ for (int i=1;i<=tot;++i){ for (int j=1;j<=tot;++j){ if ((a_id[i]&a_id[j])==0){ v.a[i][j]=1; } } } }
intmain(){ cin>>n>>x; for (rg int i=0;i<=(1<<x)-1;++i) check(i); link(); if (n==1){ cout<<tot; return0; } ed=ksm(v,n-1); for (rg int i=1;i<=tot;++i) for (rg int j=1;j<=tot;++j){ ans=(ans+ed.a[i][j]+mod)%mod; } cout<<ans; return0; }
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<ctime> #include<vector> usingnamespacestd; #define ll long long #define il inline #define rg register const ll mod=998244353; structmatrix{ ll a[233][233]; voidclr(){ memset(a,0,sizeof(a)); } }u,v,ed; ll n,x,ans; int a_id[132000],tot; int num[20]; int p; int s[132000],vis[132000]; vector<int> G[132000]; il matrix unit(){ matrix tmp; tmp.clr(); for (rg int i=1;i<=230;++i) tmp.a[i][i]=1; return tmp; } il matrix operator * (matrix aa,matrix bb){ matrix tmp; tmp.clr(); for (rg int k=1;k<=tot;++k){ for (rg int i=1;i<=tot;++i){ for (rg int j=1;j<=tot;++j){ tmp.a[i][j]=((tmp.a[i][j]+aa.a[i][k]*bb.a[k][j]))%mod; } } } return tmp; } il intwork(int tmp){ if (tmp&(1<<x)) return tmp-(1<<x)+1; elsereturn tmp; } il voidcheckcircle(int tmp){ G[tmp].push_back(tmp); a_id[++tot]=tmp; s[tmp]++; vis[tmp]=1; int nxt=work(tmp<<1); while (!vis[nxt]){ G[tmp].push_back(nxt); vis[nxt]=true; s[tmp]++; nxt=work(nxt<<1); } } il voidcheck(int tmp){ if (vis[tmp]) return; int xx=tmp; p=0; memset(num,0,sizeof(num)); while (tmp){ ++p; if (tmp&1) num[p]=true; tmp>>=1; } for (rg int i=2;i<=x;++i) if (num[i]&&num[i-1]) return; if (num[x]&&num[1]) return; checkcircle(xx); u.a[tot][tot]=s[a_id[tot]]; } il voidlink(){ for (rg int i=1;i<=tot;++i){ for (rg int j=1;j<=tot;++j){ int uu=a_id[i],vv=a_id[j],sum=0,to; if (vv==0){ v.a[i][j]=1; continue; } if (uu==0){ v.a[i][j]=s[vv]; continue; } for (rg int k=0;k<G[vv].size();++k){ to=G[vv][k]; if ((uu&to)==0) ++sum; } v.a[i][j]=sum; } } } intmain(){ cin>>n>>x; for (rg int i=0;i<=(1<<x)-1;++i) check(i); link(); matrix tmp=unit(); n--; while (n){ if (n&1) tmp=tmp*v; v=v*v; n>>=1; } ed=u*tmp; for (rg int i=1;i<=tot;++i) for (rg int j=1;j<=tot;++j){ ans=(ans+ed.a[i][j]+mod)%mod; } cout<<ans; return0; }