QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#725768 | #7873. Since A Light | TheZone | 100 ✓ | 149ms | 16064kb | C++20 | 69.5kb | 2024-11-08 19:54:27 | 2024-11-08 19:54:29 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
const int mod=998244353,ggg=3,invggg=(mod+1)/ggg;
int n,d;
struct matr{
int n,m;
vector<vector<int> >v;
void init(int nn,int mm){
n=nn;m=mm;
vector<int>q;
for(int i=0;i<m;i++)
q.push_back(0);
for(int i=0;i<n;i++)
v.push_back(q);
}
};
matr mul(matr a,matr b){
matr ret;ret.init(a.n,b.m);
for(int i=0;i<a.n;i++)
for(int k=0;k<b.n;k++)
for(int j=0;j<b.m;j++)
ret.v[i][j]=(ret.v[i][j]+1ll*a.v[i][k]*b.v[k][j])%mod;
return ret;
}
matr Mypow(matr a,int times){
if(times==1)
return a;
matr ret=Mypow(a,times/2);
ret=mul(ret,ret);
if(times&1)
ret=mul(ret,a);
return ret;
}
const int maxn=262144;
int tmp[maxn],F[maxn],G[maxn];
long long mypow(long long x,int y){
long long ret=1;
while(y){
if(y&1)ret=ret*x%mod;
y>>=1;x=x*x%mod;
}return ret;
}
int revs[maxn];
void initrev(int Len){
for(int i=1;i<Len;++i){
revs[i]=revs[i>>1]>>1;
if(i&1)revs[i]|=(Len>>1);
}
}
void DFT(int *f,int n,int rev){
int g0=rev==1?ggg:invggg;
initrev(n);
for(register int i=0;i<n;++i)
if(i<revs[i])
f[i]^=f[revs[i]]^=f[i]^=f[revs[i]];
for(register int h=2;h<=n;h<<=1){
int gn=mypow(g0,(mod-1)/h);
for(register int j=0;j<n;j+=h){
int gk=1;
for(register int k=j;k<j+(h>>1);++k){
int e=f[k],o=1ll*gk*f[k+(h>>1)]%mod;
f[k]=(e+o)%mod,f[k+(h>>1)]=(e+mod-o)%mod;
gk=1ll*gk*gn%mod;
}
}
}
if(rev==-1){
int invv=mypow(n,mod-2);
for(register int i=0;i<n;++i)
f[i]=1ll*f[i]*invv%mod;
}
}
long long dpn[2][100003];
vector<int>mat[2][2][2][2],dmat[2][2][2][2];
int f[2][200003],g[2][200003],h[2][200003],ff[262144],gg[262144],hh[262144];
void init(){
long long nw=1,x=(n+1)/2,y=(n+1)/2;
for(int i=0;i<=d;i++){
f[0][i]=nw;
if(i%2==0)
g[0][i]=nw;
else
h[0][i]=nw;
if(i<=n+1)
if((n+1-i)%2==0)
nw=nw*y%mod,
y--,
nw=nw*mypow(x-y,mod-2)%mod;
else
x++,
nw=nw*x%mod,
nw=nw*mypow(x-y,mod-2)%mod;
else break;
}nw=1;x=n/2;y=n/2;
for(int i=0;i<=d;i++){
f[1][i]=nw;
if(i%2==0)
g[1][i]=nw;
else
h[1][i]=nw;
if(i<=n)
if((n-i)%2==0)
nw=nw*y%mod,
y--,
nw=nw*mypow(x-y,mod-2)%mod;
else
x++,
nw=nw*x%mod,
nw=nw*mypow(x-y,mod-2)%mod;
else break;
}
for(int i=0;i<=d;i++)
F[i]=f[0][i],
G[i]=f[1][i];
DFT(F,maxn,1);
DFT(G,maxn,1);
for(int i=0;i<maxn;i++)
F[i]=1ll*F[i]*G[i]%mod;
DFT(F,maxn,-1);
for(int i=0;i<maxn;i++)
ff[i]=F[i];
for(int i=0;i<maxn;i++)F[i]=0,G[i]=0;
for(int i=0;i<=d;i++)
F[i]=g[0][i],
G[i]=h[1][i];
DFT(F,maxn,1);
DFT(G,maxn,1);
for(int i=0;i<maxn;i++)
F[i]=1ll*F[i]*G[i]%mod;
DFT(F,maxn,-1);
for(int i=0;i<maxn;i++)
gg[i]=F[i];
for(int i=0;i<maxn;i++)F[i]=0,G[i]=0;
for(int i=0;i<=d;i++)
F[i]=g[1][i],
G[i]=h[0][i];
DFT(F,maxn,1);
DFT(G,maxn,1);
for(int i=0;i<maxn;i++)
F[i]=1ll*F[i]*G[i]%mod;
DFT(F,maxn,-1);
for(int i=0;i<maxn;i++)
hh[i]=F[i];
}
int calc(int D,int qaq){
if(qaq==1)
return (ff[D]-hh[D]+mod)%mod;
else
return (ff[D]-gg[D]+mod)%mod;
}
int QAQ(int x,int y){
if(x==0)
return min(1,y);
return y;
}
void calcsmall(){
matr fr,time0,time1;
fr.init(1,8);
fr.v[0][4]=1;
time0.init(8,8);
time1.init(8,8);
for(int i=0;i<2;i++)
for(int j=0;j<4;j++)
for(int k=0;k<2;k++)
for(int l=0;l<=min(1,j);l++)
time0.v[k*4+j-l][i*4+j]=QAQ(j-l,mat[i][0][j%2][k][l]);
for(int i=0;i<2;i++)
for(int j=0;j<4;j++)
for(int k=0;k<2;k++)
for(int l=0;l<=min(1,j);l++)
time1.v[k*4+j-l][i*4+j]=QAQ(j-l,mat[i][1][j%2][k][l]);
time0.v[4][0]=1;
time1.v[0][4]=1;
if(n/2)
fr=mul(fr,Mypow(mul(time0,time1),n/2));
if(n%2)
fr=mul(fr,time0);
for(int i=0;i<8;i++)
dpn[i/4][i%4]=fr.v[0][i];
}
int main(){
cin>>n>>d;
for(int i=0;i<2;i++)
for(int j=0;j<2;j++){
for(int k=0;k<2;k++)
for(int l=0;l<2;l++){
for(int times=0;times<3;times++)
mat[k][i][j][l].push_back(0);
for(int times=0;times<5;times++)
dmat[k][i][j][l].push_back(0);
}
if(j){
mat[0][i][j][0][0]=1;
mat[0][i][j][1^i][1]=2;
mat[1][i][j][1][0]=1;
mat[1][i][j][1^i][1]=2;
}else{
mat[0][i][j][0][0]=1;
mat[1][i][j][1][0]=1;
mat[i][i][j][1^i][1]=1;
mat[i][i][j][1^i][2]=1;
}
}
init();
calcsmall();
for(int i=0;i<2;i++)
for(int j=0;j<2;j++){
if(j){
mat[0][i][j][1^i][1]=0;
mat[1][i][j][1^i][1]=0;
mat[0][i][j][i][1]=2;
mat[1][i][j][i][1]=2;
}else{
mat[i][i][j][i^1][1]=0;
mat[i][i][j][i^1][2]=0;
mat[i^1][i][j][i][1]=1;
mat[i^1][i][j][i][2]=1;
}
}
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
for(int k=0;k<2;k++){
for(int l=0;l<2;l++)
for(int o=0;o<3;o++)
for(int ll=0;ll<2;ll++)
for(int oo=0;oo<3;oo++)
dmat[i][j][k][ll][o+oo]+=mat[i][j][k][l][o]*mat[l][j^1][(k-o+2)%2][ll][oo];
dmat[i][j][k][i][0]--;
for(int ll=0;ll<2;ll++)
for(int oo=1;oo<3;oo++)
dmat[i][j][k][ll][oo]-=mat[1^i][j^1][k][ll][oo];
}
for(int D=4;D<=d;D++)
for(int k=0;k<2;k++){
for(int i=0;i<2;i++)
for(int j=1;j<5;j++)
if(D-j||j!=4)
dpn[k][D]+=dpn[i][D-j]*dmat[k^1][n%2][D%2][i][j];
dpn[k][D]-=calc(D-1,k);
dpn[k][D]=(dpn[k][D]%mod+mod)%mod;
}
int ans=(dpn[0][d]+dpn[1][d])%mod;
if(d%2)ans=1ll*ans*(mod+1)/2%mod;
cout<<ans;
}
/*#include<bits/stdc++.h>
using namespace std;
const int mod=998244353,ggg=3,invggg=(mod+1)/ggg;
int n,d;
struct matr{
int n,m;
vector<vector<int> >v;
void init(int nn,int mm){
n=nn;m=mm;
vector<int>q;
for(int i=0;i<m;i++)
q.push_back(0);
for(int i=0;i<n;i++)
v.push_back(q);
}
};
matr mul(matr a,matr b){
matr ret;ret.init(a.n,b.m);
for(int i=0;i<a.n;i++)
for(int k=0;k<b.n;k++)
for(int j=0;j<b.m;j++)
ret.v[i][j]=(ret.v[i][j]+1ll*a.v[i][k]*b.v[k][j])%mod;
return ret;
}
matr Mypow(matr a,int times){
if(times==1)
return a;
matr ret=Mypow(a,times/2);
ret=mul(ret,ret);
if(times&1)
ret=mul(ret,a);
return ret;
}
const int maxn=262144;
int tmp[maxn],F[maxn],G[maxn];
long long mypow(long long x,int y){
long long ret=1;
while(y){
if(y&1)ret=ret*x%mod;
y>>=1;x=x*x%mod;
}return ret;
}
int revs[maxn];
void initrev(int Len){
for(int i=1;i<Len;++i){
revs[i]=revs[i>>1]>>1;
if(i&1)revs[i]|=(Len>>1);
}
}
void DFT(int *f,int n,int rev){
int g0=rev==1?ggg:invggg;
initrev(n);
for(register int i=0;i<n;++i)
if(i<revs[i])
f[i]^=f[revs[i]]^=f[i]^=f[revs[i]];
for(register int h=2;h<=n;h<<=1){
int gn=mypow(g0,(mod-1)/h);
for(register int j=0;j<n;j+=h){
int gk=1;
for(register int k=j;k<j+(h>>1);++k){
int e=f[k],o=1ll*gk*f[k+(h>>1)]%mod;
f[k]=(e+o)%mod,f[k+(h>>1)]=(e+mod-o)%mod;
gk=1ll*gk*gn%mod;
}
}
}
if(rev==-1){
int invv=mypow(n,mod-2);
for(register int i=0;i<n;++i)
f[i]=1ll*f[i]*invv%mod;
}
}
long long dpn[2][100003];
vector<int>mat[2][2][2][2],dmat[2][2][2][2];
int f[2][200003],g[2][200003],h[2][200003],ff[262144],gg[262144],hh[262144];
void init(){
long long nw=1,x=(n+1)/2,y=(n+1)/2;
for(int i=0;i<=d;i++){
f[0][i]=nw;
if(i%2==0)
g[0][i]=nw;
else
h[0][i]=nw;
if(i<=n+1)
if((n+1-i)%2==0)
nw=nw*y%mod,
y--,
nw=nw*mypow(x-y,mod-2)%mod;
else
x++,
nw=nw*x%mod,
nw=nw*mypow(x-y,mod-2)%mod;
else break;
}nw=1;x=n/2;y=n/2;
for(int i=0;i<=d;i++){
f[1][i]=nw;
if(i%2==0)
g[1][i]=nw;
else
h[1][i]=nw;
if(i<=n)
if((n-i)%2==0)
nw=nw*y%mod,
y--,
nw=nw*mypow(x-y,mod-2)%mod;
else
x++,
nw=nw*x%mod,
nw=nw*mypow(x-y,mod-2)%mod;
else break;
}
for(int i=0;i<=d;i++)
F[i]=f[0][i],
G[i]=f[1][i];
DFT(F,maxn,1);
DFT(G,maxn,1);
for(int i=0;i<maxn;i++)
F[i]=1ll*F[i]*G[i]%mod;
DFT(F,maxn,-1);
for(int i=0;i<maxn;i++)
ff[i]=F[i];
for(int i=0;i<maxn;i++)F[i]=0,G[i]=0;
for(int i=0;i<=d;i++)
F[i]=g[0][i],
G[i]=h[1][i];
DFT(F,maxn,1);
DFT(G,maxn,1);
for(int i=0;i<maxn;i++)
F[i]=1ll*F[i]*G[i]%mod;
DFT(F,maxn,-1);
for(int i=0;i<maxn;i++)
gg[i]=F[i];
for(int i=0;i<maxn;i++)F[i]=0,G[i]=0;
for(int i=0;i<=d;i++)
F[i]=g[1][i],
G[i]=h[0][i];
DFT(F,maxn,1);
DFT(G,maxn,1);
for(int i=0;i<maxn;i++)
F[i]=1ll*F[i]*G[i]%mod;
DFT(F,maxn,-1);
for(int i=0;i<maxn;i++)
hh[i]=F[i];
}
int calc(int D,int qaq){
if(qaq==1)
return (ff[D]-hh[D]+mod)%mod;
else
return (ff[D]-gg[D]+mod)%mod;
}
int QAQ(int x,int y){
if(x==0)
return min(1,y);
return y;
}
void calcsmall(){
matr fr,time0,time1;
fr.init(1,8);
fr.v[0][4]=1;
time0.init(8,8);
time1.init(8,8);
for(int i=0;i<2;i++)
for(int j=0;j<4;j++)
for(int k=0;k<2;k++)
for(int l=0;l<=min(1,j);l++)
time0.v[k*4+j-l][i*4+j]=QAQ(j-l,mat[i][0][j%2][k][l]);
for(int i=0;i<2;i++)
for(int j=0;j<4;j++)
for(int k=0;k<2;k++)
for(int l=0;l<=min(1,j);l++)
time1.v[k*4+j-l][i*4+j]=QAQ(j-l,mat[i][1][j%2][k][l]);
time0.v[4][0]=1;
time1.v[0][4]=1;
if(n/2)
fr=mul(fr,Mypow(mul(time0,time1),n/2));
if(n%2)
fr=mul(fr,time0);
for(int i=0;i<8;i++)
dpn[i/4][i%4]=fr.v[0][i];
}
int main(){
cin>>n>>d;
for(int i=0;i<2;i++)
for(int j=0;j<2;j++){
for(int k=0;k<2;k++)
for(int l=0;l<2;l++){
for(int times=0;times<3;times++)
mat[k][i][j][l].push_back(0);
for(int times=0;times<5;times++)
dmat[k][i][j][l].push_back(0);
}
if(j){
mat[0][i][j][0][0]=1;
mat[0][i][j][1^i][1]=2;
mat[1][i][j][1][0]=1;
mat[1][i][j][1^i][1]=2;
}else{
mat[0][i][j][0][0]=1;
mat[1][i][j][1][0]=1;
mat[i][i][j][1^i][1]=1;
mat[i][i][j][1^i][2]=1;
}
}
init();
calcsmall();
for(int i=0;i<2;i++)
for(int j=0;j<2;j++){
if(j){
mat[0][i][j][1^i][1]=0;
mat[1][i][j][1^i][1]=0;
mat[0][i][j][i][1]=2;
mat[1][i][j][i][1]=2;
}else{
mat[i][i][j][i^1][1]=0;
mat[i][i][j][i^1][2]=0;
mat[i^1][i][j][i][1]=1;
mat[i^1][i][j][i][2]=1;
}
}
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
for(int k=0;k<2;k++){
for(int l=0;l<2;l++)
for(int o=0;o<3;o++)
for(int ll=0;ll<2;ll++)
for(int oo=0;oo<3;oo++)
dmat[i][j][k][ll][o+oo]+=mat[i][j][k][l][o]*mat[l][j^1][(k-o+2)%2][ll][oo];
dmat[i][j][k][i][0]--;
for(int ll=0;ll<2;ll++)
for(int oo=1;oo<3;oo++)
dmat[i][j][k][ll][oo]-=mat[1^i][j^1][k][ll][oo];
}
for(int D=4;D<=d;D++)
for(int k=0;k<2;k++){
for(int i=0;i<2;i++)
for(int j=1;j<5;j++)
if(D-j||j!=4)
dpn[k][D]+=dpn[i][D-j]*dmat[k^1][n%2][D%2][i][j];
dpn[k][D]-=calc(D-1,k);
dpn[k][D]=(dpn[k][D]%mod+mod)%mod;
}
int ans=(dpn[0][d]+dpn[1][d])%mod;
if(d%2)ans=1ll*ans*(mod+1)/2%mod;
cout<<ans;
}#include<bits/stdc++.h>
using namespace std;
const int mod=998244353,ggg=3,invggg=(mod+1)/ggg;
int n,d;
struct matr{
int n,m;
vector<vector<int> >v;
void init(int nn,int mm){
n=nn;m=mm;
vector<int>q;
for(int i=0;i<m;i++)
q.push_back(0);
for(int i=0;i<n;i++)
v.push_back(q);
}
};
matr mul(matr a,matr b){
matr ret;ret.init(a.n,b.m);
for(int i=0;i<a.n;i++)
for(int k=0;k<b.n;k++)
for(int j=0;j<b.m;j++)
ret.v[i][j]=(ret.v[i][j]+1ll*a.v[i][k]*b.v[k][j])%mod;
return ret;
}
matr Mypow(matr a,int times){
if(times==1)
return a;
matr ret=Mypow(a,times/2);
ret=mul(ret,ret);
if(times&1)
ret=mul(ret,a);
return ret;
}
const int maxn=262144;
int tmp[maxn],F[maxn],G[maxn];
long long mypow(long long x,int y){
long long ret=1;
while(y){
if(y&1)ret=ret*x%mod;
y>>=1;x=x*x%mod;
}return ret;
}
int revs[maxn];
void initrev(int Len){
for(int i=1;i<Len;++i){
revs[i]=revs[i>>1]>>1;
if(i&1)revs[i]|=(Len>>1);
}
}
void DFT(int *f,int n,int rev){
int g0=rev==1?ggg:invggg;
initrev(n);
for(register int i=0;i<n;++i)
if(i<revs[i])
f[i]^=f[revs[i]]^=f[i]^=f[revs[i]];
for(register int h=2;h<=n;h<<=1){
int gn=mypow(g0,(mod-1)/h);
for(register int j=0;j<n;j+=h){
int gk=1;
for(register int k=j;k<j+(h>>1);++k){
int e=f[k],o=1ll*gk*f[k+(h>>1)]%mod;
f[k]=(e+o)%mod,f[k+(h>>1)]=(e+mod-o)%mod;
gk=1ll*gk*gn%mod;
}
}
}
if(rev==-1){
int invv=mypow(n,mod-2);
for(register int i=0;i<n;++i)
f[i]=1ll*f[i]*invv%mod;
}
}
long long dpn[2][100003];
vector<int>mat[2][2][2][2],dmat[2][2][2][2];
int f[2][200003],g[2][200003],h[2][200003],ff[262144],gg[262144],hh[262144];
void init(){
long long nw=1,x=(n+1)/2,y=(n+1)/2;
for(int i=0;i<=d;i++){
f[0][i]=nw;
if(i%2==0)
g[0][i]=nw;
else
h[0][i]=nw;
if(i<=n+1)
if((n+1-i)%2==0)
nw=nw*y%mod,
y--,
nw=nw*mypow(x-y,mod-2)%mod;
else
x++,
nw=nw*x%mod,
nw=nw*mypow(x-y,mod-2)%mod;
else break;
}nw=1;x=n/2;y=n/2;
for(int i=0;i<=d;i++){
f[1][i]=nw;
if(i%2==0)
g[1][i]=nw;
else
h[1][i]=nw;
if(i<=n)
if((n-i)%2==0)
nw=nw*y%mod,
y--,
nw=nw*mypow(x-y,mod-2)%mod;
else
x++,
nw=nw*x%mod,
nw=nw*mypow(x-y,mod-2)%mod;
else break;
}
for(int i=0;i<=d;i++)
F[i]=f[0][i],
G[i]=f[1][i];
DFT(F,maxn,1);
DFT(G,maxn,1);
for(int i=0;i<maxn;i++)
F[i]=1ll*F[i]*G[i]%mod;
DFT(F,maxn,-1);
for(int i=0;i<maxn;i++)
ff[i]=F[i];
for(int i=0;i<maxn;i++)F[i]=0,G[i]=0;
for(int i=0;i<=d;i++)
F[i]=g[0][i],
G[i]=h[1][i];
DFT(F,maxn,1);
DFT(G,maxn,1);
for(int i=0;i<maxn;i++)
F[i]=1ll*F[i]*G[i]%mod;
DFT(F,maxn,-1);
for(int i=0;i<maxn;i++)
gg[i]=F[i];
for(int i=0;i<maxn;i++)F[i]=0,G[i]=0;
for(int i=0;i<=d;i++)
F[i]=g[1][i],
G[i]=h[0][i];
DFT(F,maxn,1);
DFT(G,maxn,1);
for(int i=0;i<maxn;i++)
F[i]=1ll*F[i]*G[i]%mod;
DFT(F,maxn,-1);
for(int i=0;i<maxn;i++)
hh[i]=F[i];
}
int calc(int D,int qaq){
if(qaq==1)
return (ff[D]-hh[D]+mod)%mod;
else
return (ff[D]-gg[D]+mod)%mod;
}
int QAQ(int x,int y){
if(x==0)
return min(1,y);
return y;
}
void calcsmall(){
matr fr,time0,time1;
fr.init(1,8);
fr.v[0][4]=1;
time0.init(8,8);
time1.init(8,8);
for(int i=0;i<2;i++)
for(int j=0;j<4;j++)
for(int k=0;k<2;k++)
for(int l=0;l<=min(1,j);l++)
time0.v[k*4+j-l][i*4+j]=QAQ(j-l,mat[i][0][j%2][k][l]);
for(int i=0;i<2;i++)
for(int j=0;j<4;j++)
for(int k=0;k<2;k++)
for(int l=0;l<=min(1,j);l++)
time1.v[k*4+j-l][i*4+j]=QAQ(j-l,mat[i][1][j%2][k][l]);
time0.v[4][0]=1;
time1.v[0][4]=1;
if(n/2)
fr=mul(fr,Mypow(mul(time0,time1),n/2));
if(n%2)
fr=mul(fr,time0);
for(int i=0;i<8;i++)
dpn[i/4][i%4]=fr.v[0][i];
}
int main(){
cin>>n>>d;
for(int i=0;i<2;i++)
for(int j=0;j<2;j++){
for(int k=0;k<2;k++)
for(int l=0;l<2;l++){
for(int times=0;times<3;times++)
mat[k][i][j][l].push_back(0);
for(int times=0;times<5;times++)
dmat[k][i][j][l].push_back(0);
}
if(j){
mat[0][i][j][0][0]=1;
mat[0][i][j][1^i][1]=2;
mat[1][i][j][1][0]=1;
mat[1][i][j][1^i][1]=2;
}else{
mat[0][i][j][0][0]=1;
mat[1][i][j][1][0]=1;
mat[i][i][j][1^i][1]=1;
mat[i][i][j][1^i][2]=1;
}
}
init();
calcsmall();
for(int i=0;i<2;i++)
for(int j=0;j<2;j++){
if(j){
mat[0][i][j][1^i][1]=0;
mat[1][i][j][1^i][1]=0;
mat[0][i][j][i][1]=2;
mat[1][i][j][i][1]=2;
}else{
mat[i][i][j][i^1][1]=0;
mat[i][i][j][i^1][2]=0;
mat[i^1][i][j][i][1]=1;
mat[i^1][i][j][i][2]=1;
}
}
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
for(int k=0;k<2;k++){
for(int l=0;l<2;l++)
for(int o=0;o<3;o++)
for(int ll=0;ll<2;ll++)
for(int oo=0;oo<3;oo++)
dmat[i][j][k][ll][o+oo]+=mat[i][j][k][l][o]*mat[l][j^1][(k-o+2)%2][ll][oo];
dmat[i][j][k][i][0]--;
for(int ll=0;ll<2;ll++)
for(int oo=1;oo<3;oo++)
dmat[i][j][k][ll][oo]-=mat[1^i][j^1][k][ll][oo];
}
for(int D=4;D<=d;D++)
for(int k=0;k<2;k++){
for(int i=0;i<2;i++)
for(int j=1;j<5;j++)
if(D-j||j!=4)
dpn[k][D]+=dpn[i][D-j]*dmat[k^1][n%2][D%2][i][j];
dpn[k][D]-=calc(D-1,k);
dpn[k][D]=(dpn[k][D]%mod+mod)%mod;
}
int ans=(dpn[0][d]+dpn[1][d])%mod;
if(d%2)ans=1ll*ans*(mod+1)/2%mod;
cout<<ans;
}#include<bits/stdc++.h>
using namespace std;
const int mod=998244353,ggg=3,invggg=(mod+1)/ggg;
int n,d;
struct matr{
int n,m;
vector<vector<int> >v;
void init(int nn,int mm){
n=nn;m=mm;
vector<int>q;
for(int i=0;i<m;i++)
q.push_back(0);
for(int i=0;i<n;i++)
v.push_back(q);
}
};
matr mul(matr a,matr b){
matr ret;ret.init(a.n,b.m);
for(int i=0;i<a.n;i++)
for(int k=0;k<b.n;k++)
for(int j=0;j<b.m;j++)
ret.v[i][j]=(ret.v[i][j]+1ll*a.v[i][k]*b.v[k][j])%mod;
return ret;
}
matr Mypow(matr a,int times){
if(times==1)
return a;
matr ret=Mypow(a,times/2);
ret=mul(ret,ret);
if(times&1)
ret=mul(ret,a);
return ret;
}
const int maxn=262144;
int tmp[maxn],F[maxn],G[maxn];
long long mypow(long long x,int y){
long long ret=1;
while(y){
if(y&1)ret=ret*x%mod;
y>>=1;x=x*x%mod;
}return ret;
}
int revs[maxn];
void initrev(int Len){
for(int i=1;i<Len;++i){
revs[i]=revs[i>>1]>>1;
if(i&1)revs[i]|=(Len>>1);
}
}
void DFT(int *f,int n,int rev){
int g0=rev==1?ggg:invggg;
initrev(n);
for(register int i=0;i<n;++i)
if(i<revs[i])
f[i]^=f[revs[i]]^=f[i]^=f[revs[i]];
for(register int h=2;h<=n;h<<=1){
int gn=mypow(g0,(mod-1)/h);
for(register int j=0;j<n;j+=h){
int gk=1;
for(register int k=j;k<j+(h>>1);++k){
int e=f[k],o=1ll*gk*f[k+(h>>1)]%mod;
f[k]=(e+o)%mod,f[k+(h>>1)]=(e+mod-o)%mod;
gk=1ll*gk*gn%mod;
}
}
}
if(rev==-1){
int invv=mypow(n,mod-2);
for(register int i=0;i<n;++i)
f[i]=1ll*f[i]*invv%mod;
}
}
long long dpn[2][100003];
vector<int>mat[2][2][2][2],dmat[2][2][2][2];
int f[2][200003],g[2][200003],h[2][200003],ff[262144],gg[262144],hh[262144];
void init(){
long long nw=1,x=(n+1)/2,y=(n+1)/2;
for(int i=0;i<=d;i++){
f[0][i]=nw;
if(i%2==0)
g[0][i]=nw;
else
h[0][i]=nw;
if(i<=n+1)
if((n+1-i)%2==0)
nw=nw*y%mod,
y--,
nw=nw*mypow(x-y,mod-2)%mod;
else
x++,
nw=nw*x%mod,
nw=nw*mypow(x-y,mod-2)%mod;
else break;
}nw=1;x=n/2;y=n/2;
for(int i=0;i<=d;i++){
f[1][i]=nw;
if(i%2==0)
g[1][i]=nw;
else
h[1][i]=nw;
if(i<=n)
if((n-i)%2==0)
nw=nw*y%mod,
y--,
nw=nw*mypow(x-y,mod-2)%mod;
else
x++,
nw=nw*x%mod,
nw=nw*mypow(x-y,mod-2)%mod;
else break;
}
for(int i=0;i<=d;i++)
F[i]=f[0][i],
G[i]=f[1][i];
DFT(F,maxn,1);
DFT(G,maxn,1);
for(int i=0;i<maxn;i++)
F[i]=1ll*F[i]*G[i]%mod;
DFT(F,maxn,-1);
for(int i=0;i<maxn;i++)
ff[i]=F[i];
for(int i=0;i<maxn;i++)F[i]=0,G[i]=0;
for(int i=0;i<=d;i++)
F[i]=g[0][i],
G[i]=h[1][i];
DFT(F,maxn,1);
DFT(G,maxn,1);
for(int i=0;i<maxn;i++)
F[i]=1ll*F[i]*G[i]%mod;
DFT(F,maxn,-1);
for(int i=0;i<maxn;i++)
gg[i]=F[i];
for(int i=0;i<maxn;i++)F[i]=0,G[i]=0;
for(int i=0;i<=d;i++)
F[i]=g[1][i],
G[i]=h[0][i];
DFT(F,maxn,1);
DFT(G,maxn,1);
for(int i=0;i<maxn;i++)
F[i]=1ll*F[i]*G[i]%mod;
DFT(F,maxn,-1);
for(int i=0;i<maxn;i++)
hh[i]=F[i];
}
int calc(int D,int qaq){
if(qaq==1)
return (ff[D]-hh[D]+mod)%mod;
else
return (ff[D]-gg[D]+mod)%mod;
}
int QAQ(int x,int y){
if(x==0)
return min(1,y);
return y;
}
void calcsmall(){
matr fr,time0,time1;
fr.init(1,8);
fr.v[0][4]=1;
time0.init(8,8);
time1.init(8,8);
for(int i=0;i<2;i++)
for(int j=0;j<4;j++)
for(int k=0;k<2;k++)
for(int l=0;l<=min(1,j);l++)
time0.v[k*4+j-l][i*4+j]=QAQ(j-l,mat[i][0][j%2][k][l]);
for(int i=0;i<2;i++)
for(int j=0;j<4;j++)
for(int k=0;k<2;k++)
for(int l=0;l<=min(1,j);l++)
time1.v[k*4+j-l][i*4+j]=QAQ(j-l,mat[i][1][j%2][k][l]);
time0.v[4][0]=1;
time1.v[0][4]=1;
if(n/2)
fr=mul(fr,Mypow(mul(time0,time1),n/2));
if(n%2)
fr=mul(fr,time0);
for(int i=0;i<8;i++)
dpn[i/4][i%4]=fr.v[0][i];
}
int main(){
cin>>n>>d;
for(int i=0;i<2;i++)
for(int j=0;j<2;j++){
for(int k=0;k<2;k++)
for(int l=0;l<2;l++){
for(int times=0;times<3;times++)
mat[k][i][j][l].push_back(0);
for(int times=0;times<5;times++)
dmat[k][i][j][l].push_back(0);
}
if(j){
mat[0][i][j][0][0]=1;
mat[0][i][j][1^i][1]=2;
mat[1][i][j][1][0]=1;
mat[1][i][j][1^i][1]=2;
}else{
mat[0][i][j][0][0]=1;
mat[1][i][j][1][0]=1;
mat[i][i][j][1^i][1]=1;
mat[i][i][j][1^i][2]=1;
}
}
init();
calcsmall();
for(int i=0;i<2;i++)
for(int j=0;j<2;j++){
if(j){
mat[0][i][j][1^i][1]=0;
mat[1][i][j][1^i][1]=0;
mat[0][i][j][i][1]=2;
mat[1][i][j][i][1]=2;
}else{
mat[i][i][j][i^1][1]=0;
mat[i][i][j][i^1][2]=0;
mat[i^1][i][j][i][1]=1;
mat[i^1][i][j][i][2]=1;
}
}
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
for(int k=0;k<2;k++){
for(int l=0;l<2;l++)
for(int o=0;o<3;o++)
for(int ll=0;ll<2;ll++)
for(int oo=0;oo<3;oo++)
dmat[i][j][k][ll][o+oo]+=mat[i][j][k][l][o]*mat[l][j^1][(k-o+2)%2][ll][oo];
dmat[i][j][k][i][0]--;
for(int ll=0;ll<2;ll++)
for(int oo=1;oo<3;oo++)
dmat[i][j][k][ll][oo]-=mat[1^i][j^1][k][ll][oo];
}
for(int D=4;D<=d;D++)
for(int k=0;k<2;k++){
for(int i=0;i<2;i++)
for(int j=1;j<5;j++)
if(D-j||j!=4)
dpn[k][D]+=dpn[i][D-j]*dmat[k^1][n%2][D%2][i][j];
dpn[k][D]-=calc(D-1,k);
dpn[k][D]=(dpn[k][D]%mod+mod)%mod;
}
int ans=(dpn[0][d]+dpn[1][d])%mod;
if(d%2)ans=1ll*ans*(mod+1)/2%mod;
cout<<ans;
}#include<bits/stdc++.h>
using namespace std;
const int mod=998244353,ggg=3,invggg=(mod+1)/ggg;
int n,d;
struct matr{
int n,m;
vector<vector<int> >v;
void init(int nn,int mm){
n=nn;m=mm;
vector<int>q;
for(int i=0;i<m;i++)
q.push_back(0);
for(int i=0;i<n;i++)
v.push_back(q);
}
};
matr mul(matr a,matr b){
matr ret;ret.init(a.n,b.m);
for(int i=0;i<a.n;i++)
for(int k=0;k<b.n;k++)
for(int j=0;j<b.m;j++)
ret.v[i][j]=(ret.v[i][j]+1ll*a.v[i][k]*b.v[k][j])%mod;
return ret;
}
matr Mypow(matr a,int times){
if(times==1)
return a;
matr ret=Mypow(a,times/2);
ret=mul(ret,ret);
if(times&1)
ret=mul(ret,a);
return ret;
}
const int maxn=262144;
int tmp[maxn],F[maxn],G[maxn];
long long mypow(long long x,int y){
long long ret=1;
while(y){
if(y&1)ret=ret*x%mod;
y>>=1;x=x*x%mod;
}return ret;
}
int revs[maxn];
void initrev(int Len){
for(int i=1;i<Len;++i){
revs[i]=revs[i>>1]>>1;
if(i&1)revs[i]|=(Len>>1);
}
}
void DFT(int *f,int n,int rev){
int g0=rev==1?ggg:invggg;
initrev(n);
for(register int i=0;i<n;++i)
if(i<revs[i])
f[i]^=f[revs[i]]^=f[i]^=f[revs[i]];
for(register int h=2;h<=n;h<<=1){
int gn=mypow(g0,(mod-1)/h);
for(register int j=0;j<n;j+=h){
int gk=1;
for(register int k=j;k<j+(h>>1);++k){
int e=f[k],o=1ll*gk*f[k+(h>>1)]%mod;
f[k]=(e+o)%mod,f[k+(h>>1)]=(e+mod-o)%mod;
gk=1ll*gk*gn%mod;
}
}
}
if(rev==-1){
int invv=mypow(n,mod-2);
for(register int i=0;i<n;++i)
f[i]=1ll*f[i]*invv%mod;
}
}
long long dpn[2][100003];
vector<int>mat[2][2][2][2],dmat[2][2][2][2];
int f[2][200003],g[2][200003],h[2][200003],ff[262144],gg[262144],hh[262144];
void init(){
long long nw=1,x=(n+1)/2,y=(n+1)/2;
for(int i=0;i<=d;i++){
f[0][i]=nw;
if(i%2==0)
g[0][i]=nw;
else
h[0][i]=nw;
if(i<=n+1)
if((n+1-i)%2==0)
nw=nw*y%mod,
y--,
nw=nw*mypow(x-y,mod-2)%mod;
else
x++,
nw=nw*x%mod,
nw=nw*mypow(x-y,mod-2)%mod;
else break;
}nw=1;x=n/2;y=n/2;
for(int i=0;i<=d;i++){
f[1][i]=nw;
if(i%2==0)
g[1][i]=nw;
else
h[1][i]=nw;
if(i<=n)
if((n-i)%2==0)
nw=nw*y%mod,
y--,
nw=nw*mypow(x-y,mod-2)%mod;
else
x++,
nw=nw*x%mod,
nw=nw*mypow(x-y,mod-2)%mod;
else break;
}
for(int i=0;i<=d;i++)
F[i]=f[0][i],
G[i]=f[1][i];
DFT(F,maxn,1);
DFT(G,maxn,1);
for(int i=0;i<maxn;i++)
F[i]=1ll*F[i]*G[i]%mod;
DFT(F,maxn,-1);
for(int i=0;i<maxn;i++)
ff[i]=F[i];
for(int i=0;i<maxn;i++)F[i]=0,G[i]=0;
for(int i=0;i<=d;i++)
F[i]=g[0][i],
G[i]=h[1][i];
DFT(F,maxn,1);
DFT(G,maxn,1);
for(int i=0;i<maxn;i++)
F[i]=1ll*F[i]*G[i]%mod;
DFT(F,maxn,-1);
for(int i=0;i<maxn;i++)
gg[i]=F[i];
for(int i=0;i<maxn;i++)F[i]=0,G[i]=0;
for(int i=0;i<=d;i++)
F[i]=g[1][i],
G[i]=h[0][i];
DFT(F,maxn,1);
DFT(G,maxn,1);
for(int i=0;i<maxn;i++)
F[i]=1ll*F[i]*G[i]%mod;
DFT(F,maxn,-1);
for(int i=0;i<maxn;i++)
hh[i]=F[i];
}
int calc(int D,int qaq){
if(qaq==1)
return (ff[D]-hh[D]+mod)%mod;
else
return (ff[D]-gg[D]+mod)%mod;
}
int QAQ(int x,int y){
if(x==0)
return min(1,y);
return y;
}
void calcsmall(){
matr fr,time0,time1;
fr.init(1,8);
fr.v[0][4]=1;
time0.init(8,8);
time1.init(8,8);
for(int i=0;i<2;i++)
for(int j=0;j<4;j++)
for(int k=0;k<2;k++)
for(int l=0;l<=min(1,j);l++)
time0.v[k*4+j-l][i*4+j]=QAQ(j-l,mat[i][0][j%2][k][l]);
for(int i=0;i<2;i++)
for(int j=0;j<4;j++)
for(int k=0;k<2;k++)
for(int l=0;l<=min(1,j);l++)
time1.v[k*4+j-l][i*4+j]=QAQ(j-l,mat[i][1][j%2][k][l]);
time0.v[4][0]=1;
time1.v[0][4]=1;
if(n/2)
fr=mul(fr,Mypow(mul(time0,time1),n/2));
if(n%2)
fr=mul(fr,time0);
for(int i=0;i<8;i++)
dpn[i/4][i%4]=fr.v[0][i];
}
int main(){
cin>>n>>d;
for(int i=0;i<2;i++)
for(int j=0;j<2;j++){
for(int k=0;k<2;k++)
for(int l=0;l<2;l++){
for(int times=0;times<3;times++)
mat[k][i][j][l].push_back(0);
for(int times=0;times<5;times++)
dmat[k][i][j][l].push_back(0);
}
if(j){
mat[0][i][j][0][0]=1;
mat[0][i][j][1^i][1]=2;
mat[1][i][j][1][0]=1;
mat[1][i][j][1^i][1]=2;
}else{
mat[0][i][j][0][0]=1;
mat[1][i][j][1][0]=1;
mat[i][i][j][1^i][1]=1;
mat[i][i][j][1^i][2]=1;
}
}
init();
calcsmall();
for(int i=0;i<2;i++)
for(int j=0;j<2;j++){
if(j){
mat[0][i][j][1^i][1]=0;
mat[1][i][j][1^i][1]=0;
mat[0][i][j][i][1]=2;
mat[1][i][j][i][1]=2;
}else{
mat[i][i][j][i^1][1]=0;
mat[i][i][j][i^1][2]=0;
mat[i^1][i][j][i][1]=1;
mat[i^1][i][j][i][2]=1;
}
}
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
for(int k=0;k<2;k++){
for(int l=0;l<2;l++)
for(int o=0;o<3;o++)
for(int ll=0;ll<2;ll++)
for(int oo=0;oo<3;oo++)
dmat[i][j][k][ll][o+oo]+=mat[i][j][k][l][o]*mat[l][j^1][(k-o+2)%2][ll][oo];
dmat[i][j][k][i][0]--;
for(int ll=0;ll<2;ll++)
for(int oo=1;oo<3;oo++)
dmat[i][j][k][ll][oo]-=mat[1^i][j^1][k][ll][oo];
}
for(int D=4;D<=d;D++)
for(int k=0;k<2;k++){
for(int i=0;i<2;i++)
for(int j=1;j<5;j++)
if(D-j||j!=4)
dpn[k][D]+=dpn[i][D-j]*dmat[k^1][n%2][D%2][i][j];
dpn[k][D]-=calc(D-1,k);
dpn[k][D]=(dpn[k][D]%mod+mod)%mod;
}
int ans=(dpn[0][d]+dpn[1][d])%mod;
if(d%2)ans=1ll*ans*(mod+1)/2%mod;
cout<<ans;
}#include<bits/stdc++.h>
using namespace std;
const int mod=998244353,ggg=3,invggg=(mod+1)/ggg;
int n,d;
struct matr{
int n,m;
vector<vector<int> >v;
void init(int nn,int mm){
n=nn;m=mm;
vector<int>q;
for(int i=0;i<m;i++)
q.push_back(0);
for(int i=0;i<n;i++)
v.push_back(q);
}
};
matr mul(matr a,matr b){
matr ret;ret.init(a.n,b.m);
for(int i=0;i<a.n;i++)
for(int k=0;k<b.n;k++)
for(int j=0;j<b.m;j++)
ret.v[i][j]=(ret.v[i][j]+1ll*a.v[i][k]*b.v[k][j])%mod;
return ret;
}
matr Mypow(matr a,int times){
if(times==1)
return a;
matr ret=Mypow(a,times/2);
ret=mul(ret,ret);
if(times&1)
ret=mul(ret,a);
return ret;
}
const int maxn=262144;
int tmp[maxn],F[maxn],G[maxn];
long long mypow(long long x,int y){
long long ret=1;
while(y){
if(y&1)ret=ret*x%mod;
y>>=1;x=x*x%mod;
}return ret;
}
int revs[maxn];
void initrev(int Len){
for(int i=1;i<Len;++i){
revs[i]=revs[i>>1]>>1;
if(i&1)revs[i]|=(Len>>1);
}
}
void DFT(int *f,int n,int rev){
int g0=rev==1?ggg:invggg;
initrev(n);
for(register int i=0;i<n;++i)
if(i<revs[i])
f[i]^=f[revs[i]]^=f[i]^=f[revs[i]];
for(register int h=2;h<=n;h<<=1){
int gn=mypow(g0,(mod-1)/h);
for(register int j=0;j<n;j+=h){
int gk=1;
for(register int k=j;k<j+(h>>1);++k){
int e=f[k],o=1ll*gk*f[k+(h>>1)]%mod;
f[k]=(e+o)%mod,f[k+(h>>1)]=(e+mod-o)%mod;
gk=1ll*gk*gn%mod;
}
}
}
if(rev==-1){
int invv=mypow(n,mod-2);
for(register int i=0;i<n;++i)
f[i]=1ll*f[i]*invv%mod;
}
}
long long dpn[2][100003];
vector<int>mat[2][2][2][2],dmat[2][2][2][2];
int f[2][200003],g[2][200003],h[2][200003],ff[262144],gg[262144],hh[262144];
void init(){
long long nw=1,x=(n+1)/2,y=(n+1)/2;
for(int i=0;i<=d;i++){
f[0][i]=nw;
if(i%2==0)
g[0][i]=nw;
else
h[0][i]=nw;
if(i<=n+1)
if((n+1-i)%2==0)
nw=nw*y%mod,
y--,
nw=nw*mypow(x-y,mod-2)%mod;
else
x++,
nw=nw*x%mod,
nw=nw*mypow(x-y,mod-2)%mod;
else break;
}nw=1;x=n/2;y=n/2;
for(int i=0;i<=d;i++){
f[1][i]=nw;
if(i%2==0)
g[1][i]=nw;
else
h[1][i]=nw;
if(i<=n)
if((n-i)%2==0)
nw=nw*y%mod,
y--,
nw=nw*mypow(x-y,mod-2)%mod;
else
x++,
nw=nw*x%mod,
nw=nw*mypow(x-y,mod-2)%mod;
else break;
}
for(int i=0;i<=d;i++)
F[i]=f[0][i],
G[i]=f[1][i];
DFT(F,maxn,1);
DFT(G,maxn,1);
for(int i=0;i<maxn;i++)
F[i]=1ll*F[i]*G[i]%mod;
DFT(F,maxn,-1);
for(int i=0;i<maxn;i++)
ff[i]=F[i];
for(int i=0;i<maxn;i++)F[i]=0,G[i]=0;
for(int i=0;i<=d;i++)
F[i]=g[0][i],
G[i]=h[1][i];
DFT(F,maxn,1);
DFT(G,maxn,1);
for(int i=0;i<maxn;i++)
F[i]=1ll*F[i]*G[i]%mod;
DFT(F,maxn,-1);
for(int i=0;i<maxn;i++)
gg[i]=F[i];
for(int i=0;i<maxn;i++)F[i]=0,G[i]=0;
for(int i=0;i<=d;i++)
F[i]=g[1][i],
G[i]=h[0][i];
DFT(F,maxn,1);
DFT(G,maxn,1);
for(int i=0;i<maxn;i++)
F[i]=1ll*F[i]*G[i]%mod;
DFT(F,maxn,-1);
for(int i=0;i<maxn;i++)
hh[i]=F[i];
}
int calc(int D,int qaq){
if(qaq==1)
return (ff[D]-hh[D]+mod)%mod;
else
return (ff[D]-gg[D]+mod)%mod;
}
int QAQ(int x,int y){
if(x==0)
return min(1,y);
return y;
}
void calcsmall(){
matr fr,time0,time1;
fr.init(1,8);
fr.v[0][4]=1;
time0.init(8,8);
time1.init(8,8);
for(int i=0;i<2;i++)
for(int j=0;j<4;j++)
for(int k=0;k<2;k++)
for(int l=0;l<=min(1,j);l++)
time0.v[k*4+j-l][i*4+j]=QAQ(j-l,mat[i][0][j%2][k][l]);
for(int i=0;i<2;i++)
for(int j=0;j<4;j++)
for(int k=0;k<2;k++)
for(int l=0;l<=min(1,j);l++)
time1.v[k*4+j-l][i*4+j]=QAQ(j-l,mat[i][1][j%2][k][l]);
time0.v[4][0]=1;
time1.v[0][4]=1;
if(n/2)
fr=mul(fr,Mypow(mul(time0,time1),n/2));
if(n%2)
fr=mul(fr,time0);
for(int i=0;i<8;i++)
dpn[i/4][i%4]=fr.v[0][i];
}
int main(){
cin>>n>>d;
for(int i=0;i<2;i++)
for(int j=0;j<2;j++){
for(int k=0;k<2;k++)
for(int l=0;l<2;l++){
for(int times=0;times<3;times++)
mat[k][i][j][l].push_back(0);
for(int times=0;times<5;times++)
dmat[k][i][j][l].push_back(0);
}
if(j){
mat[0][i][j][0][0]=1;
mat[0][i][j][1^i][1]=2;
mat[1][i][j][1][0]=1;
mat[1][i][j][1^i][1]=2;
}else{
mat[0][i][j][0][0]=1;
mat[1][i][j][1][0]=1;
mat[i][i][j][1^i][1]=1;
mat[i][i][j][1^i][2]=1;
}
}
init();
calcsmall();
for(int i=0;i<2;i++)
for(int j=0;j<2;j++){
if(j){
mat[0][i][j][1^i][1]=0;
mat[1][i][j][1^i][1]=0;
mat[0][i][j][i][1]=2;
mat[1][i][j][i][1]=2;
}else{
mat[i][i][j][i^1][1]=0;
mat[i][i][j][i^1][2]=0;
mat[i^1][i][j][i][1]=1;
mat[i^1][i][j][i][2]=1;
}
}
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
for(int k=0;k<2;k++){
for(int l=0;l<2;l++)
for(int o=0;o<3;o++)
for(int ll=0;ll<2;ll++)
for(int oo=0;oo<3;oo++)
dmat[i][j][k][ll][o+oo]+=mat[i][j][k][l][o]*mat[l][j^1][(k-o+2)%2][ll][oo];
dmat[i][j][k][i][0]--;
for(int ll=0;ll<2;ll++)
for(int oo=1;oo<3;oo++)
dmat[i][j][k][ll][oo]-=mat[1^i][j^1][k][ll][oo];
}
for(int D=4;D<=d;D++)
for(int k=0;k<2;k++){
for(int i=0;i<2;i++)
for(int j=1;j<5;j++)
if(D-j||j!=4)
dpn[k][D]+=dpn[i][D-j]*dmat[k^1][n%2][D%2][i][j];
dpn[k][D]-=calc(D-1,k);
dpn[k][D]=(dpn[k][D]%mod+mod)%mod;
}
int ans=(dpn[0][d]+dpn[1][d])%mod;
if(d%2)ans=1ll*ans*(mod+1)/2%mod;
cout<<ans;
}#include<bits/stdc++.h>
using namespace std;
const int mod=998244353,ggg=3,invggg=(mod+1)/ggg;
int n,d;
struct matr{
int n,m;
vector<vector<int> >v;
void init(int nn,int mm){
n=nn;m=mm;
vector<int>q;
for(int i=0;i<m;i++)
q.push_back(0);
for(int i=0;i<n;i++)
v.push_back(q);
}
};
matr mul(matr a,matr b){
matr ret;ret.init(a.n,b.m);
for(int i=0;i<a.n;i++)
for(int k=0;k<b.n;k++)
for(int j=0;j<b.m;j++)
ret.v[i][j]=(ret.v[i][j]+1ll*a.v[i][k]*b.v[k][j])%mod;
return ret;
}
matr Mypow(matr a,int times){
if(times==1)
return a;
matr ret=Mypow(a,times/2);
ret=mul(ret,ret);
if(times&1)
ret=mul(ret,a);
return ret;
}
const int maxn=262144;
int tmp[maxn],F[maxn],G[maxn];
long long mypow(long long x,int y){
long long ret=1;
while(y){
if(y&1)ret=ret*x%mod;
y>>=1;x=x*x%mod;
}return ret;
}
int revs[maxn];
void initrev(int Len){
for(int i=1;i<Len;++i){
revs[i]=revs[i>>1]>>1;
if(i&1)revs[i]|=(Len>>1);
}
}
void DFT(int *f,int n,int rev){
int g0=rev==1?ggg:invggg;
initrev(n);
for(register int i=0;i<n;++i)
if(i<revs[i])
f[i]^=f[revs[i]]^=f[i]^=f[revs[i]];
for(register int h=2;h<=n;h<<=1){
int gn=mypow(g0,(mod-1)/h);
for(register int j=0;j<n;j+=h){
int gk=1;
for(register int k=j;k<j+(h>>1);++k){
int e=f[k],o=1ll*gk*f[k+(h>>1)]%mod;
f[k]=(e+o)%mod,f[k+(h>>1)]=(e+mod-o)%mod;
gk=1ll*gk*gn%mod;
}
}
}
if(rev==-1){
int invv=mypow(n,mod-2);
for(register int i=0;i<n;++i)
f[i]=1ll*f[i]*invv%mod;
}
}
long long dpn[2][100003];
vector<int>mat[2][2][2][2],dmat[2][2][2][2];
int f[2][200003],g[2][200003],h[2][200003],ff[262144],gg[262144],hh[262144];
void init(){
long long nw=1,x=(n+1)/2,y=(n+1)/2;
for(int i=0;i<=d;i++){
f[0][i]=nw;
if(i%2==0)
g[0][i]=nw;
else
h[0][i]=nw;
if(i<=n+1)
if((n+1-i)%2==0)
nw=nw*y%mod,
y--,
nw=nw*mypow(x-y,mod-2)%mod;
else
x++,
nw=nw*x%mod,
nw=nw*mypow(x-y,mod-2)%mod;
else break;
}nw=1;x=n/2;y=n/2;
for(int i=0;i<=d;i++){
f[1][i]=nw;
if(i%2==0)
g[1][i]=nw;
else
h[1][i]=nw;
if(i<=n)
if((n-i)%2==0)
nw=nw*y%mod,
y--,
nw=nw*mypow(x-y,mod-2)%mod;
else
x++,
nw=nw*x%mod,
nw=nw*mypow(x-y,mod-2)%mod;
else break;
}
for(int i=0;i<=d;i++)
F[i]=f[0][i],
G[i]=f[1][i];
DFT(F,maxn,1);
DFT(G,maxn,1);
for(int i=0;i<maxn;i++)
F[i]=1ll*F[i]*G[i]%mod;
DFT(F,maxn,-1);
for(int i=0;i<maxn;i++)
ff[i]=F[i];
for(int i=0;i<maxn;i++)F[i]=0,G[i]=0;
for(int i=0;i<=d;i++)
F[i]=g[0][i],
G[i]=h[1][i];
DFT(F,maxn,1);
DFT(G,maxn,1);
for(int i=0;i<maxn;i++)
F[i]=1ll*F[i]*G[i]%mod;
DFT(F,maxn,-1);
for(int i=0;i<maxn;i++)
gg[i]=F[i];
for(int i=0;i<maxn;i++)F[i]=0,G[i]=0;
for(int i=0;i<=d;i++)
F[i]=g[1][i],
G[i]=h[0][i];
DFT(F,maxn,1);
DFT(G,maxn,1);
for(int i=0;i<maxn;i++)
F[i]=1ll*F[i]*G[i]%mod;
DFT(F,maxn,-1);
for(int i=0;i<maxn;i++)
hh[i]=F[i];
}
int calc(int D,int qaq){
if(qaq==1)
return (ff[D]-hh[D]+mod)%mod;
else
return (ff[D]-gg[D]+mod)%mod;
}
int QAQ(int x,int y){
if(x==0)
return min(1,y);
return y;
}
void calcsmall(){
matr fr,time0,time1;
fr.init(1,8);
fr.v[0][4]=1;
time0.init(8,8);
time1.init(8,8);
for(int i=0;i<2;i++)
for(int j=0;j<4;j++)
for(int k=0;k<2;k++)
for(int l=0;l<=min(1,j);l++)
time0.v[k*4+j-l][i*4+j]=QAQ(j-l,mat[i][0][j%2][k][l]);
for(int i=0;i<2;i++)
for(int j=0;j<4;j++)
for(int k=0;k<2;k++)
for(int l=0;l<=min(1,j);l++)
time1.v[k*4+j-l][i*4+j]=QAQ(j-l,mat[i][1][j%2][k][l]);
time0.v[4][0]=1;
time1.v[0][4]=1;
if(n/2)
fr=mul(fr,Mypow(mul(time0,time1),n/2));
if(n%2)
fr=mul(fr,time0);
for(int i=0;i<8;i++)
dpn[i/4][i%4]=fr.v[0][i];
}
int main(){
cin>>n>>d;
for(int i=0;i<2;i++)
for(int j=0;j<2;j++){
for(int k=0;k<2;k++)
for(int l=0;l<2;l++){
for(int times=0;times<3;times++)
mat[k][i][j][l].push_back(0);
for(int times=0;times<5;times++)
dmat[k][i][j][l].push_back(0);
}
if(j){
mat[0][i][j][0][0]=1;
mat[0][i][j][1^i][1]=2;
mat[1][i][j][1][0]=1;
mat[1][i][j][1^i][1]=2;
}else{
mat[0][i][j][0][0]=1;
mat[1][i][j][1][0]=1;
mat[i][i][j][1^i][1]=1;
mat[i][i][j][1^i][2]=1;
}
}
init();
calcsmall();
for(int i=0;i<2;i++)
for(int j=0;j<2;j++){
if(j){
mat[0][i][j][1^i][1]=0;
mat[1][i][j][1^i][1]=0;
mat[0][i][j][i][1]=2;
mat[1][i][j][i][1]=2;
}else{
mat[i][i][j][i^1][1]=0;
mat[i][i][j][i^1][2]=0;
mat[i^1][i][j][i][1]=1;
mat[i^1][i][j][i][2]=1;
}
}
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
for(int k=0;k<2;k++){
for(int l=0;l<2;l++)
for(int o=0;o<3;o++)
for(int ll=0;ll<2;ll++)
for(int oo=0;oo<3;oo++)
dmat[i][j][k][ll][o+oo]+=mat[i][j][k][l][o]*mat[l][j^1][(k-o+2)%2][ll][oo];
dmat[i][j][k][i][0]--;
for(int ll=0;ll<2;ll++)
for(int oo=1;oo<3;oo++)
dmat[i][j][k][ll][oo]-=mat[1^i][j^1][k][ll][oo];
}
for(int D=4;D<=d;D++)
for(int k=0;k<2;k++){
for(int i=0;i<2;i++)
for(int j=1;j<5;j++)
if(D-j||j!=4)
dpn[k][D]+=dpn[i][D-j]*dmat[k^1][n%2][D%2][i][j];
dpn[k][D]-=calc(D-1,k);
dpn[k][D]=(dpn[k][D]%mod+mod)%mod;
}
int ans=(dpn[0][d]+dpn[1][d])%mod;
if(d%2)ans=1ll*ans*(mod+1)/2%mod;
cout<<ans;
}#include<bits/stdc++.h>
using namespace std;
const int mod=998244353,ggg=3,invggg=(mod+1)/ggg;
int n,d;
struct matr{
int n,m;
vector<vector<int> >v;
void init(int nn,int mm){
n=nn;m=mm;
vector<int>q;
for(int i=0;i<m;i++)
q.push_back(0);
for(int i=0;i<n;i++)
v.push_back(q);
}
};
matr mul(matr a,matr b){
matr ret;ret.init(a.n,b.m);
for(int i=0;i<a.n;i++)
for(int k=0;k<b.n;k++)
for(int j=0;j<b.m;j++)
ret.v[i][j]=(ret.v[i][j]+1ll*a.v[i][k]*b.v[k][j])%mod;
return ret;
}
matr Mypow(matr a,int times){
if(times==1)
return a;
matr ret=Mypow(a,times/2);
ret=mul(ret,ret);
if(times&1)
ret=mul(ret,a);
return ret;
}
const int maxn=262144;
int tmp[maxn],F[maxn],G[maxn];
long long mypow(long long x,int y){
long long ret=1;
while(y){
if(y&1)ret=ret*x%mod;
y>>=1;x=x*x%mod;
}return ret;
}
int revs[maxn];
void initrev(int Len){
for(int i=1;i<Len;++i){
revs[i]=revs[i>>1]>>1;
if(i&1)revs[i]|=(Len>>1);
}
}
void DFT(int *f,int n,int rev){
int g0=rev==1?ggg:invggg;
initrev(n);
for(register int i=0;i<n;++i)
if(i<revs[i])
f[i]^=f[revs[i]]^=f[i]^=f[revs[i]];
for(register int h=2;h<=n;h<<=1){
int gn=mypow(g0,(mod-1)/h);
for(register int j=0;j<n;j+=h){
int gk=1;
for(register int k=j;k<j+(h>>1);++k){
int e=f[k],o=1ll*gk*f[k+(h>>1)]%mod;
f[k]=(e+o)%mod,f[k+(h>>1)]=(e+mod-o)%mod;
gk=1ll*gk*gn%mod;
}
}
}
if(rev==-1){
int invv=mypow(n,mod-2);
for(register int i=0;i<n;++i)
f[i]=1ll*f[i]*invv%mod;
}
}
long long dpn[2][100003];
vector<int>mat[2][2][2][2],dmat[2][2][2][2];
int f[2][200003],g[2][200003],h[2][200003],ff[262144],gg[262144],hh[262144];
void init(){
long long nw=1,x=(n+1)/2,y=(n+1)/2;
for(int i=0;i<=d;i++){
f[0][i]=nw;
if(i%2==0)
g[0][i]=nw;
else
h[0][i]=nw;
if(i<=n+1)
if((n+1-i)%2==0)
nw=nw*y%mod,
y--,
nw=nw*mypow(x-y,mod-2)%mod;
else
x++,
nw=nw*x%mod,
nw=nw*mypow(x-y,mod-2)%mod;
else break;
}nw=1;x=n/2;y=n/2;
for(int i=0;i<=d;i++){
f[1][i]=nw;
if(i%2==0)
g[1][i]=nw;
else
h[1][i]=nw;
if(i<=n)
if((n-i)%2==0)
nw=nw*y%mod,
y--,
nw=nw*mypow(x-y,mod-2)%mod;
else
x++,
nw=nw*x%mod,
nw=nw*mypow(x-y,mod-2)%mod;
else break;
}
for(int i=0;i<=d;i++)
F[i]=f[0][i],
G[i]=f[1][i];
DFT(F,maxn,1);
DFT(G,maxn,1);
for(int i=0;i<maxn;i++)
F[i]=1ll*F[i]*G[i]%mod;
DFT(F,maxn,-1);
for(int i=0;i<maxn;i++)
ff[i]=F[i];
for(int i=0;i<maxn;i++)F[i]=0,G[i]=0;
for(int i=0;i<=d;i++)
F[i]=g[0][i],
G[i]=h[1][i];
DFT(F,maxn,1);
DFT(G,maxn,1);
for(int i=0;i<maxn;i++)
F[i]=1ll*F[i]*G[i]%mod;
DFT(F,maxn,-1);
for(int i=0;i<maxn;i++)
gg[i]=F[i];
for(int i=0;i<maxn;i++)F[i]=0,G[i]=0;
for(int i=0;i<=d;i++)
F[i]=g[1][i],
G[i]=h[0][i];
DFT(F,maxn,1);
DFT(G,maxn,1);
for(int i=0;i<maxn;i++)
F[i]=1ll*F[i]*G[i]%mod;
DFT(F,maxn,-1);
for(int i=0;i<maxn;i++)
hh[i]=F[i];
}
int calc(int D,int qaq){
if(qaq==1)
return (ff[D]-hh[D]+mod)%mod;
else
return (ff[D]-gg[D]+mod)%mod;
}
int QAQ(int x,int y){
if(x==0)
return min(1,y);
return y;
}
void calcsmall(){
matr fr,time0,time1;
fr.init(1,8);
fr.v[0][4]=1;
time0.init(8,8);
time1.init(8,8);
for(int i=0;i<2;i++)
for(int j=0;j<4;j++)
for(int k=0;k<2;k++)
for(int l=0;l<=min(1,j);l++)
time0.v[k*4+j-l][i*4+j]=QAQ(j-l,mat[i][0][j%2][k][l]);
for(int i=0;i<2;i++)
for(int j=0;j<4;j++)
for(int k=0;k<2;k++)
for(int l=0;l<=min(1,j);l++)
time1.v[k*4+j-l][i*4+j]=QAQ(j-l,mat[i][1][j%2][k][l]);
time0.v[4][0]=1;
time1.v[0][4]=1;
if(n/2)
fr=mul(fr,Mypow(mul(time0,time1),n/2));
if(n%2)
fr=mul(fr,time0);
for(int i=0;i<8;i++)
dpn[i/4][i%4]=fr.v[0][i];
}
int main(){
cin>>n>>d;
for(int i=0;i<2;i++)
for(int j=0;j<2;j++){
for(int k=0;k<2;k++)
for(int l=0;l<2;l++){
for(int times=0;times<3;times++)
mat[k][i][j][l].push_back(0);
for(int times=0;times<5;times++)
dmat[k][i][j][l].push_back(0);
}
if(j){
mat[0][i][j][0][0]=1;
mat[0][i][j][1^i][1]=2;
mat[1][i][j][1][0]=1;
mat[1][i][j][1^i][1]=2;
}else{
mat[0][i][j][0][0]=1;
mat[1][i][j][1][0]=1;
mat[i][i][j][1^i][1]=1;
mat[i][i][j][1^i][2]=1;
}
}
init();
calcsmall();
for(int i=0;i<2;i++)
for(int j=0;j<2;j++){
if(j){
mat[0][i][j][1^i][1]=0;
mat[1][i][j][1^i][1]=0;
mat[0][i][j][i][1]=2;
mat[1][i][j][i][1]=2;
}else{
mat[i][i][j][i^1][1]=0;
mat[i][i][j][i^1][2]=0;
mat[i^1][i][j][i][1]=1;
mat[i^1][i][j][i][2]=1;
}
}
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
for(int k=0;k<2;k++){
for(int l=0;l<2;l++)
for(int o=0;o<3;o++)
for(int ll=0;ll<2;ll++)
for(int oo=0;oo<3;oo++)
dmat[i][j][k][ll][o+oo]+=mat[i][j][k][l][o]*mat[l][j^1][(k-o+2)%2][ll][oo];
dmat[i][j][k][i][0]--;
for(int ll=0;ll<2;ll++)
for(int oo=1;oo<3;oo++)
dmat[i][j][k][ll][oo]-=mat[1^i][j^1][k][ll][oo];
}
for(int D=4;D<=d;D++)
for(int k=0;k<2;k++){
for(int i=0;i<2;i++)
for(int j=1;j<5;j++)
if(D-j||j!=4)
dpn[k][D]+=dpn[i][D-j]*dmat[k^1][n%2][D%2][i][j];
dpn[k][D]-=calc(D-1,k);
dpn[k][D]=(dpn[k][D]%mod+mod)%mod;
}
int ans=(dpn[0][d]+dpn[1][d])%mod;
if(d%2)ans=1ll*ans*(mod+1)/2%mod;
cout<<ans;
}#include<bits/stdc++.h>
using namespace std;
const int mod=998244353,ggg=3,invggg=(mod+1)/ggg;
int n,d;
struct matr{
int n,m;
vector<vector<int> >v;
void init(int nn,int mm){
n=nn;m=mm;
vector<int>q;
for(int i=0;i<m;i++)
q.push_back(0);
for(int i=0;i<n;i++)
v.push_back(q);
}
};
matr mul(matr a,matr b){
matr ret;ret.init(a.n,b.m);
for(int i=0;i<a.n;i++)
for(int k=0;k<b.n;k++)
for(int j=0;j<b.m;j++)
ret.v[i][j]=(ret.v[i][j]+1ll*a.v[i][k]*b.v[k][j])%mod;
return ret;
}
matr Mypow(matr a,int times){
if(times==1)
return a;
matr ret=Mypow(a,times/2);
ret=mul(ret,ret);
if(times&1)
ret=mul(ret,a);
return ret;
}
const int maxn=262144;
int tmp[maxn],F[maxn],G[maxn];
long long mypow(long long x,int y){
long long ret=1;
while(y){
if(y&1)ret=ret*x%mod;
y>>=1;x=x*x%mod;
}return ret;
}
int revs[maxn];
void initrev(int Len){
for(int i=1;i<Len;++i){
revs[i]=revs[i>>1]>>1;
if(i&1)revs[i]|=(Len>>1);
}
}
void DFT(int *f,int n,int rev){
int g0=rev==1?ggg:invggg;
initrev(n);
for(register int i=0;i<n;++i)
if(i<revs[i])
f[i]^=f[revs[i]]^=f[i]^=f[revs[i]];
for(register int h=2;h<=n;h<<=1){
int gn=mypow(g0,(mod-1)/h);
for(register int j=0;j<n;j+=h){
int gk=1;
for(register int k=j;k<j+(h>>1);++k){
int e=f[k],o=1ll*gk*f[k+(h>>1)]%mod;
f[k]=(e+o)%mod,f[k+(h>>1)]=(e+mod-o)%mod;
gk=1ll*gk*gn%mod;
}
}
}
if(rev==-1){
int invv=mypow(n,mod-2);
for(register int i=0;i<n;++i)
f[i]=1ll*f[i]*invv%mod;
}
}
long long dpn[2][100003];
vector<int>mat[2][2][2][2],dmat[2][2][2][2];
int f[2][200003],g[2][200003],h[2][200003],ff[262144],gg[262144],hh[262144];
void init(){
long long nw=1,x=(n+1)/2,y=(n+1)/2;
for(int i=0;i<=d;i++){
f[0][i]=nw;
if(i%2==0)
g[0][i]=nw;
else
h[0][i]=nw;
if(i<=n+1)
if((n+1-i)%2==0)
nw=nw*y%mod,
y--,
nw=nw*mypow(x-y,mod-2)%mod;
else
x++,
nw=nw*x%mod,
nw=nw*mypow(x-y,mod-2)%mod;
else break;
}nw=1;x=n/2;y=n/2;
for(int i=0;i<=d;i++){
f[1][i]=nw;
if(i%2==0)
g[1][i]=nw;
else
h[1][i]=nw;
if(i<=n)
if((n-i)%2==0)
nw=nw*y%mod,
y--,
nw=nw*mypow(x-y,mod-2)%mod;
else
x++,
nw=nw*x%mod,
nw=nw*mypow(x-y,mod-2)%mod;
else break;
}
for(int i=0;i<=d;i++)
F[i]=f[0][i],
G[i]=f[1][i];
DFT(F,maxn,1);
DFT(G,maxn,1);
for(int i=0;i<maxn;i++)
F[i]=1ll*F[i]*G[i]%mod;
DFT(F,maxn,-1);
for(int i=0;i<maxn;i++)
ff[i]=F[i];
for(int i=0;i<maxn;i++)F[i]=0,G[i]=0;
for(int i=0;i<=d;i++)
F[i]=g[0][i],
G[i]=h[1][i];
DFT(F,maxn,1);
DFT(G,maxn,1);
for(int i=0;i<maxn;i++)
F[i]=1ll*F[i]*G[i]%mod;
DFT(F,maxn,-1);
for(int i=0;i<maxn;i++)
gg[i]=F[i];
for(int i=0;i<maxn;i++)F[i]=0,G[i]=0;
for(int i=0;i<=d;i++)
F[i]=g[1][i],
G[i]=h[0][i];
DFT(F,maxn,1);
DFT(G,maxn,1);
for(int i=0;i<maxn;i++)
F[i]=1ll*F[i]*G[i]%mod;
DFT(F,maxn,-1);
for(int i=0;i<maxn;i++)
hh[i]=F[i];
}
int calc(int D,int qaq){
if(qaq==1)
return (ff[D]-hh[D]+mod)%mod;
else
return (ff[D]-gg[D]+mod)%mod;
}
int QAQ(int x,int y){
if(x==0)
return min(1,y);
return y;
}
void calcsmall(){
matr fr,time0,time1;
fr.init(1,8);
fr.v[0][4]=1;
time0.init(8,8);
time1.init(8,8);
for(int i=0;i<2;i++)
for(int j=0;j<4;j++)
for(int k=0;k<2;k++)
for(int l=0;l<=min(1,j);l++)
time0.v[k*4+j-l][i*4+j]=QAQ(j-l,mat[i][0][j%2][k][l]);
for(int i=0;i<2;i++)
for(int j=0;j<4;j++)
for(int k=0;k<2;k++)
for(int l=0;l<=min(1,j);l++)
time1.v[k*4+j-l][i*4+j]=QAQ(j-l,mat[i][1][j%2][k][l]);
time0.v[4][0]=1;
time1.v[0][4]=1;
if(n/2)
fr=mul(fr,Mypow(mul(time0,time1),n/2));
if(n%2)
fr=mul(fr,time0);
for(int i=0;i<8;i++)
dpn[i/4][i%4]=fr.v[0][i];
}
int main(){
cin>>n>>d;
for(int i=0;i<2;i++)
for(int j=0;j<2;j++){
for(int k=0;k<2;k++)
for(int l=0;l<2;l++){
for(int times=0;times<3;times++)
mat[k][i][j][l].push_back(0);
for(int times=0;times<5;times++)
dmat[k][i][j][l].push_back(0);
}
if(j){
mat[0][i][j][0][0]=1;
mat[0][i][j][1^i][1]=2;
mat[1][i][j][1][0]=1;
mat[1][i][j][1^i][1]=2;
}else{
mat[0][i][j][0][0]=1;
mat[1][i][j][1][0]=1;
mat[i][i][j][1^i][1]=1;
mat[i][i][j][1^i][2]=1;
}
}
init();
calcsmall();
for(int i=0;i<2;i++)
for(int j=0;j<2;j++){
if(j){
mat[0][i][j][1^i][1]=0;
mat[1][i][j][1^i][1]=0;
mat[0][i][j][i][1]=2;
mat[1][i][j][i][1]=2;
}else{
mat[i][i][j][i^1][1]=0;
mat[i][i][j][i^1][2]=0;
mat[i^1][i][j][i][1]=1;
mat[i^1][i][j][i][2]=1;
}
}
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
for(int k=0;k<2;k++){
for(int l=0;l<2;l++)
for(int o=0;o<3;o++)
for(int ll=0;ll<2;ll++)
for(int oo=0;oo<3;oo++)
dmat[i][j][k][ll][o+oo]+=mat[i][j][k][l][o]*mat[l][j^1][(k-o+2)%2][ll][oo];
dmat[i][j][k][i][0]--;
for(int ll=0;ll<2;ll++)
for(int oo=1;oo<3;oo++)
dmat[i][j][k][ll][oo]-=mat[1^i][j^1][k][ll][oo];
}
for(int D=4;D<=d;D++)
for(int k=0;k<2;k++){
for(int i=0;i<2;i++)
for(int j=1;j<5;j++)
if(D-j||j!=4)
dpn[k][D]+=dpn[i][D-j]*dmat[k^1][n%2][D%2][i][j];
dpn[k][D]-=calc(D-1,k);
dpn[k][D]=(dpn[k][D]%mod+mod)%mod;
}
int ans=(dpn[0][d]+dpn[1][d])%mod;
if(d%2)ans=1ll*ans*(mod+1)/2%mod;
cout<<ans;
}#include<bits/stdc++.h>
using namespace std;
const int mod=998244353,ggg=3,invggg=(mod+1)/ggg;
int n,d;
struct matr{
int n,m;
vector<vector<int> >v;
void init(int nn,int mm){
n=nn;m=mm;
vector<int>q;
for(int i=0;i<m;i++)
q.push_back(0);
for(int i=0;i<n;i++)
v.push_back(q);
}
};
matr mul(matr a,matr b){
matr ret;ret.init(a.n,b.m);
for(int i=0;i<a.n;i++)
for(int k=0;k<b.n;k++)
for(int j=0;j<b.m;j++)
ret.v[i][j]=(ret.v[i][j]+1ll*a.v[i][k]*b.v[k][j])%mod;
return ret;
}
matr Mypow(matr a,int times){
if(times==1)
return a;
matr ret=Mypow(a,times/2);
ret=mul(ret,ret);
if(times&1)
ret=mul(ret,a);
return ret;
}
const int maxn=262144;
int tmp[maxn],F[maxn],G[maxn];
long long mypow(long long x,int y){
long long ret=1;
while(y){
if(y&1)ret=ret*x%mod;
y>>=1;x=x*x%mod;
}return ret;
}
int revs[maxn];
void initrev(int Len){
for(int i=1;i<Len;++i){
revs[i]=revs[i>>1]>>1;
if(i&1)revs[i]|=(Len>>1);
}
}
void DFT(int *f,int n,int rev){
int g0=rev==1?ggg:invggg;
initrev(n);
for(register int i=0;i<n;++i)
if(i<revs[i])
f[i]^=f[revs[i]]^=f[i]^=f[revs[i]];
for(register int h=2;h<=n;h<<=1){
int gn=mypow(g0,(mod-1)/h);
for(register int j=0;j<n;j+=h){
int gk=1;
for(register int k=j;k<j+(h>>1);++k){
int e=f[k],o=1ll*gk*f[k+(h>>1)]%mod;
f[k]=(e+o)%mod,f[k+(h>>1)]=(e+mod-o)%mod;
gk=1ll*gk*gn%mod;
}
}
}
if(rev==-1){
int invv=mypow(n,mod-2);
for(register int i=0;i<n;++i)
f[i]=1ll*f[i]*invv%mod;
}
}
long long dpn[2][100003];
vector<int>mat[2][2][2][2],dmat[2][2][2][2];
int f[2][200003],g[2][200003],h[2][200003],ff[262144],gg[262144],hh[262144];
void init(){
long long nw=1,x=(n+1)/2,y=(n+1)/2;
for(int i=0;i<=d;i++){
f[0][i]=nw;
if(i%2==0)
g[0][i]=nw;
else
h[0][i]=nw;
if(i<=n+1)
if((n+1-i)%2==0)
nw=nw*y%mod,
y--,
nw=nw*mypow(x-y,mod-2)%mod;
else
x++,
nw=nw*x%mod,
nw=nw*mypow(x-y,mod-2)%mod;
else break;
}nw=1;x=n/2;y=n/2;
for(int i=0;i<=d;i++){
f[1][i]=nw;
if(i%2==0)
g[1][i]=nw;
else
h[1][i]=nw;
if(i<=n)
if((n-i)%2==0)
nw=nw*y%mod,
y--,
nw=nw*mypow(x-y,mod-2)%mod;
else
x++,
nw=nw*x%mod,
nw=nw*mypow(x-y,mod-2)%mod;
else break;
}
for(int i=0;i<=d;i++)
F[i]=f[0][i],
G[i]=f[1][i];
DFT(F,maxn,1);
DFT(G,maxn,1);
for(int i=0;i<maxn;i++)
F[i]=1ll*F[i]*G[i]%mod;
DFT(F,maxn,-1);
for(int i=0;i<maxn;i++)
ff[i]=F[i];
for(int i=0;i<maxn;i++)F[i]=0,G[i]=0;
for(int i=0;i<=d;i++)
F[i]=g[0][i],
G[i]=h[1][i];
DFT(F,maxn,1);
DFT(G,maxn,1);
for(int i=0;i<maxn;i++)
F[i]=1ll*F[i]*G[i]%mod;
DFT(F,maxn,-1);
for(int i=0;i<maxn;i++)
gg[i]=F[i];
for(int i=0;i<maxn;i++)F[i]=0,G[i]=0;
for(int i=0;i<=d;i++)
F[i]=g[1][i],
G[i]=h[0][i];
DFT(F,maxn,1);
DFT(G,maxn,1);
for(int i=0;i<maxn;i++)
F[i]=1ll*F[i]*G[i]%mod;
DFT(F,maxn,-1);
for(int i=0;i<maxn;i++)
hh[i]=F[i];
}
int calc(int D,int qaq){
if(qaq==1)
return (ff[D]-hh[D]+mod)%mod;
else
return (ff[D]-gg[D]+mod)%mod;
}
int QAQ(int x,int y){
if(x==0)
return min(1,y);
return y;
}
void calcsmall(){
matr fr,time0,time1;
fr.init(1,8);
fr.v[0][4]=1;
time0.init(8,8);
time1.init(8,8);
for(int i=0;i<2;i++)
for(int j=0;j<4;j++)
for(int k=0;k<2;k++)
for(int l=0;l<=min(1,j);l++)
time0.v[k*4+j-l][i*4+j]=QAQ(j-l,mat[i][0][j%2][k][l]);
for(int i=0;i<2;i++)
for(int j=0;j<4;j++)
for(int k=0;k<2;k++)
for(int l=0;l<=min(1,j);l++)
time1.v[k*4+j-l][i*4+j]=QAQ(j-l,mat[i][1][j%2][k][l]);
time0.v[4][0]=1;
time1.v[0][4]=1;
if(n/2)
fr=mul(fr,Mypow(mul(time0,time1),n/2));
if(n%2)
fr=mul(fr,time0);
for(int i=0;i<8;i++)
dpn[i/4][i%4]=fr.v[0][i];
}
int main(){
cin>>n>>d;
for(int i=0;i<2;i++)
for(int j=0;j<2;j++){
for(int k=0;k<2;k++)
for(int l=0;l<2;l++){
for(int times=0;times<3;times++)
mat[k][i][j][l].push_back(0);
for(int times=0;times<5;times++)
dmat[k][i][j][l].push_back(0);
}
if(j){
mat[0][i][j][0][0]=1;
mat[0][i][j][1^i][1]=2;
mat[1][i][j][1][0]=1;
mat[1][i][j][1^i][1]=2;
}else{
mat[0][i][j][0][0]=1;
mat[1][i][j][1][0]=1;
mat[i][i][j][1^i][1]=1;
mat[i][i][j][1^i][2]=1;
}
}
init();
calcsmall();
for(int i=0;i<2;i++)
for(int j=0;j<2;j++){
if(j){
mat[0][i][j][1^i][1]=0;
mat[1][i][j][1^i][1]=0;
mat[0][i][j][i][1]=2;
mat[1][i][j][i][1]=2;
}else{
mat[i][i][j][i^1][1]=0;
mat[i][i][j][i^1][2]=0;
mat[i^1][i][j][i][1]=1;
mat[i^1][i][j][i][2]=1;
}
}
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
for(int k=0;k<2;k++){
for(int l=0;l<2;l++)
for(int o=0;o<3;o++)
for(int ll=0;ll<2;ll++)
for(int oo=0;oo<3;oo++)
dmat[i][j][k][ll][o+oo]+=mat[i][j][k][l][o]*mat[l][j^1][(k-o+2)%2][ll][oo];
dmat[i][j][k][i][0]--;
for(int ll=0;ll<2;ll++)
for(int oo=1;oo<3;oo++)
dmat[i][j][k][ll][oo]-=mat[1^i][j^1][k][ll][oo];
}
for(int D=4;D<=d;D++)
for(int k=0;k<2;k++){
for(int i=0;i<2;i++)
for(int j=1;j<5;j++)
if(D-j||j!=4)
dpn[k][D]+=dpn[i][D-j]*dmat[k^1][n%2][D%2][i][j];
dpn[k][D]-=calc(D-1,k);
dpn[k][D]=(dpn[k][D]%mod+mod)%mod;
}
int ans=(dpn[0][d]+dpn[1][d])%mod;
if(d%2)ans=1ll*ans*(mod+1)/2%mod;
cout<<ans;
}#include<bits/stdc++.h>
using namespace std;
const int mod=998244353,ggg=3,invggg=(mod+1)/ggg;
int n,d;
struct matr{
int n,m;
vector<vector<int> >v;
void init(int nn,int mm){
n=nn;m=mm;
vector<int>q;
for(int i=0;i<m;i++)
q.push_back(0);
for(int i=0;i<n;i++)
v.push_back(q);
}
};
matr mul(matr a,matr b){
matr ret;ret.init(a.n,b.m);
for(int i=0;i<a.n;i++)
for(int k=0;k<b.n;k++)
for(int j=0;j<b.m;j++)
ret.v[i][j]=(ret.v[i][j]+1ll*a.v[i][k]*b.v[k][j])%mod;
return ret;
}
matr Mypow(matr a,int times){
if(times==1)
return a;
matr ret=Mypow(a,times/2);
ret=mul(ret,ret);
if(times&1)
ret=mul(ret,a);
return ret;
}
const int maxn=262144;
int tmp[maxn],F[maxn],G[maxn];
long long mypow(long long x,int y){
long long ret=1;
while(y){
if(y&1)ret=ret*x%mod;
y>>=1;x=x*x%mod;
}return ret;
}
int revs[maxn];
void initrev(int Len){
for(int i=1;i<Len;++i){
revs[i]=revs[i>>1]>>1;
if(i&1)revs[i]|=(Len>>1);
}
}
void DFT(int *f,int n,int rev){
int g0=rev==1?ggg:invggg;
initrev(n);
for(register int i=0;i<n;++i)
if(i<revs[i])
f[i]^=f[revs[i]]^=f[i]^=f[revs[i]];
for(register int h=2;h<=n;h<<=1){
int gn=mypow(g0,(mod-1)/h);
for(register int j=0;j<n;j+=h){
int gk=1;
for(register int k=j;k<j+(h>>1);++k){
int e=f[k],o=1ll*gk*f[k+(h>>1)]%mod;
f[k]=(e+o)%mod,f[k+(h>>1)]=(e+mod-o)%mod;
gk=1ll*gk*gn%mod;
}
}
}
if(rev==-1){
int invv=mypow(n,mod-2);
for(register int i=0;i<n;++i)
f[i]=1ll*f[i]*invv%mod;
}
}
long long dpn[2][100003];
vector<int>mat[2][2][2][2],dmat[2][2][2][2];
int f[2][200003],g[2][200003],h[2][200003],ff[262144],gg[262144],hh[262144];
void init(){
long long nw=1,x=(n+1)/2,y=(n+1)/2;
for(int i=0;i<=d;i++){
f[0][i]=nw;
if(i%2==0)
g[0][i]=nw;
else
h[0][i]=nw;
if(i<=n+1)
if((n+1-i)%2==0)
nw=nw*y%mod,
y--,
nw=nw*mypow(x-y,mod-2)%mod;
else
x++,
nw=nw*x%mod,
nw=nw*mypow(x-y,mod-2)%mod;
else break;
}nw=1;x=n/2;y=n/2;
for(int i=0;i<=d;i++){
f[1][i]=nw;
if(i%2==0)
g[1][i]=nw;
else
h[1][i]=nw;
if(i<=n)
if((n-i)%2==0)
nw=nw*y%mod,
y--,
nw=nw*mypow(x-y,mod-2)%mod;
else
x++,
nw=nw*x%mod,
nw=nw*mypow(x-y,mod-2)%mod;
else break;
}
for(int i=0;i<=d;i++)
F[i]=f[0][i],
G[i]=f[1][i];
DFT(F,maxn,1);
DFT(G,maxn,1);
for(int i=0;i<maxn;i++)
F[i]=1ll*F[i]*G[i]%mod;
DFT(F,maxn,-1);
for(int i=0;i<maxn;i++)
ff[i]=F[i];
for(int i=0;i<maxn;i++)F[i]=0,G[i]=0;
for(int i=0;i<=d;i++)
F[i]=g[0][i],
G[i]=h[1][i];
DFT(F,maxn,1);
DFT(G,maxn,1);
for(int i=0;i<maxn;i++)
F[i]=1ll*F[i]*G[i]%mod;
DFT(F,maxn,-1);
for(int i=0;i<maxn;i++)
gg[i]=F[i];
for(int i=0;i<maxn;i++)F[i]=0,G[i]=0;
for(int i=0;i<=d;i++)
F[i]=g[1][i],
G[i]=h[0][i];
DFT(F,maxn,1);
DFT(G,maxn,1);
for(int i=0;i<maxn;i++)
F[i]=1ll*F[i]*G[i]%mod;
DFT(F,maxn,-1);
for(int i=0;i<maxn;i++)
hh[i]=F[i];
}
int calc(int D,int qaq){
if(qaq==1)
return (ff[D]-hh[D]+mod)%mod;
else
return (ff[D]-gg[D]+mod)%mod;
}
int QAQ(int x,int y){
if(x==0)
return min(1,y);
return y;
}
void calcsmall(){
matr fr,time0,time1;
fr.init(1,8);
fr.v[0][4]=1;
time0.init(8,8);
time1.init(8,8);
for(int i=0;i<2;i++)
for(int j=0;j<4;j++)
for(int k=0;k<2;k++)
for(int l=0;l<=min(1,j);l++)
time0.v[k*4+j-l][i*4+j]=QAQ(j-l,mat[i][0][j%2][k][l]);
for(int i=0;i<2;i++)
for(int j=0;j<4;j++)
for(int k=0;k<2;k++)
for(int l=0;l<=min(1,j);l++)
time1.v[k*4+j-l][i*4+j]=QAQ(j-l,mat[i][1][j%2][k][l]);
time0.v[4][0]=1;
time1.v[0][4]=1;
if(n/2)
fr=mul(fr,Mypow(mul(time0,time1),n/2));
if(n%2)
fr=mul(fr,time0);
for(int i=0;i<8;i++)
dpn[i/4][i%4]=fr.v[0][i];
}
int main(){
cin>>n>>d;
for(int i=0;i<2;i++)
for(int j=0;j<2;j++){
for(int k=0;k<2;k++)
for(int l=0;l<2;l++){
for(int times=0;times<3;times++)
mat[k][i][j][l].push_back(0);
for(int times=0;times<5;times++)
dmat[k][i][j][l].push_back(0);
}
if(j){
mat[0][i][j][0][0]=1;
mat[0][i][j][1^i][1]=2;
mat[1][i][j][1][0]=1;
mat[1][i][j][1^i][1]=2;
}else{
mat[0][i][j][0][0]=1;
mat[1][i][j][1][0]=1;
mat[i][i][j][1^i][1]=1;
mat[i][i][j][1^i][2]=1;
}
}
init();
calcsmall();
for(int i=0;i<2;i++)
for(int j=0;j<2;j++){
if(j){
mat[0][i][j][1^i][1]=0;
mat[1][i][j][1^i][1]=0;
mat[0][i][j][i][1]=2;
mat[1][i][j][i][1]=2;
}else{
mat[i][i][j][i^1][1]=0;
mat[i][i][j][i^1][2]=0;
mat[i^1][i][j][i][1]=1;
mat[i^1][i][j][i][2]=1;
}
}
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
for(int k=0;k<2;k++){
for(int l=0;l<2;l++)
for(int o=0;o<3;o++)
for(int ll=0;ll<2;ll++)
for(int oo=0;oo<3;oo++)
dmat[i][j][k][ll][o+oo]+=mat[i][j][k][l][o]*mat[l][j^1][(k-o+2)%2][ll][oo];
dmat[i][j][k][i][0]--;
for(int ll=0;ll<2;ll++)
for(int oo=1;oo<3;oo++)
dmat[i][j][k][ll][oo]-=mat[1^i][j^1][k][ll][oo];
}
for(int D=4;D<=d;D++)
for(int k=0;k<2;k++){
for(int i=0;i<2;i++)
for(int j=1;j<5;j++)
if(D-j||j!=4)
dpn[k][D]+=dpn[i][D-j]*dmat[k^1][n%2][D%2][i][j];
dpn[k][D]-=calc(D-1,k);
dpn[k][D]=(dpn[k][D]%mod+mod)%mod;
}
int ans=(dpn[0][d]+dpn[1][d])%mod;
if(d%2)ans=1ll*ans*(mod+1)/2%mod;
cout<<ans;
}#include<bits/stdc++.h>
using namespace std;
const int mod=998244353,ggg=3,invggg=(mod+1)/ggg;
int n,d;
struct matr{
int n,m;
vector<vector<int> >v;
void init(int nn,int mm){
n=nn;m=mm;
vector<int>q;
for(int i=0;i<m;i++)
q.push_back(0);
for(int i=0;i<n;i++)
v.push_back(q);
}
};
matr mul(matr a,matr b){
matr ret;ret.init(a.n,b.m);
for(int i=0;i<a.n;i++)
for(int k=0;k<b.n;k++)
for(int j=0;j<b.m;j++)
ret.v[i][j]=(ret.v[i][j]+1ll*a.v[i][k]*b.v[k][j])%mod;
return ret;
}
matr Mypow(matr a,int times){
if(times==1)
return a;
matr ret=Mypow(a,times/2);
ret=mul(ret,ret);
if(times&1)
ret=mul(ret,a);
return ret;
}
const int maxn=262144;
int tmp[maxn],F[maxn],G[maxn];
long long mypow(long long x,int y){
long long ret=1;
while(y){
if(y&1)ret=ret*x%mod;
y>>=1;x=x*x%mod;
}return ret;
}
int revs[maxn];
void initrev(int Len){
for(int i=1;i<Len;++i){
revs[i]=revs[i>>1]>>1;
if(i&1)revs[i]|=(Len>>1);
}
}
void DFT(int *f,int n,int rev){
int g0=rev==1?ggg:invggg;
initrev(n);
for(register int i=0;i<n;++i)
if(i<revs[i])
f[i]^=f[revs[i]]^=f[i]^=f[revs[i]];
for(register int h=2;h<=n;h<<=1){
int gn=mypow(g0,(mod-1)/h);
for(register int j=0;j<n;j+=h){
int gk=1;
for(register int k=j;k<j+(h>>1);++k){
int e=f[k],o=1ll*gk*f[k+(h>>1)]%mod;
f[k]=(e+o)%mod,f[k+(h>>1)]=(e+mod-o)%mod;
gk=1ll*gk*gn%mod;
}
}
}
if(rev==-1){
int invv=mypow(n,mod-2);
for(register int i=0;i<n;++i)
f[i]=1ll*f[i]*invv%mod;
}
}
long long dpn[2][100003];
vector<int>mat[2][2][2][2],dmat[2][2][2][2];
int f[2][200003],g[2][200003],h[2][200003],ff[262144],gg[262144],hh[262144];
void init(){
long long nw=1,x=(n+1)/2,y=(n+1)/2;
for(int i=0;i<=d;i++){
f[0][i]=nw;
if(i%2==0)
g[0][i]=nw;
else
h[0][i]=nw;
if(i<=n+1)
if((n+1-i)%2==0)
nw=nw*y%mod,
y--,
nw=nw*mypow(x-y,mod-2)%mod;
else
x++,
nw=nw*x%mod,
nw=nw*mypow(x-y,mod-2)%mod;
else break;
}nw=1;x=n/2;y=n/2;
for(int i=0;i<=d;i++){
f[1][i]=nw;
if(i%2==0)
g[1][i]=nw;
else
h[1][i]=nw;
if(i<=n)
if((n-i)%2==0)
nw=nw*y%mod,
y--,
nw=nw*mypow(x-y,mod-2)%mod;
else
x++,
nw=nw*x%mod,
nw=nw*mypow(x-y,mod-2)%mod;
else break;
}
for(int i=0;i<=d;i++)
F[i]=f[0][i],
G[i]=f[1][i];
DFT(F,maxn,1);
DFT(G,maxn,1);
for(int i=0;i<maxn;i++)
F[i]=1ll*F[i]*G[i]%mod;
DFT(F,maxn,-1);
for(int i=0;i<maxn;i++)
ff[i]=F[i];
for(int i=0;i<maxn;i++)F[i]=0,G[i]=0;
for(int i=0;i<=d;i++)
F[i]=g[0][i],
G[i]=h[1][i];
DFT(F,maxn,1);
DFT(G,maxn,1);
for(int i=0;i<maxn;i++)
F[i]=1ll*F[i]*G[i]%mod;
DFT(F,maxn,-1);
for(int i=0;i<maxn;i++)
gg[i]=F[i];
for(int i=0;i<maxn;i++)F[i]=0,G[i]=0;
for(int i=0;i<=d;i++)
F[i]=g[1][i],
G[i]=h[0][i];
DFT(F,maxn,1);
DFT(G,maxn,1);
for(int i=0;i<maxn;i++)
F[i]=1ll*F[i]*G[i]%mod;
DFT(F,maxn,-1);
for(int i=0;i<maxn;i++)
hh[i]=F[i];
}
int calc(int D,int qaq){
if(qaq==1)
return (ff[D]-hh[D]+mod)%mod;
else
return (ff[D]-gg[D]+mod)%mod;
}
int QAQ(int x,int y){
if(x==0)
return min(1,y);
return y;
}
void calcsmall(){
matr fr,time0,time1;
fr.init(1,8);
fr.v[0][4]=1;
time0.init(8,8);
time1.init(8,8);
for(int i=0;i<2;i++)
for(int j=0;j<4;j++)
for(int k=0;k<2;k++)
for(int l=0;l<=min(1,j);l++)
time0.v[k*4+j-l][i*4+j]=QAQ(j-l,mat[i][0][j%2][k][l]);
for(int i=0;i<2;i++)
for(int j=0;j<4;j++)
for(int k=0;k<2;k++)
for(int l=0;l<=min(1,j);l++)
time1.v[k*4+j-l][i*4+j]=QAQ(j-l,mat[i][1][j%2][k][l]);
time0.v[4][0]=1;
time1.v[0][4]=1;
if(n/2)
fr=mul(fr,Mypow(mul(time0,time1),n/2));
if(n%2)
fr=mul(fr,time0);
for(int i=0;i<8;i++)
dpn[i/4][i%4]=fr.v[0][i];
}
int main(){
cin>>n>>d;
for(int i=0;i<2;i++)
for(int j=0;j<2;j++){
for(int k=0;k<2;k++)
for(int l=0;l<2;l++){
for(int times=0;times<3;times++)
mat[k][i][j][l].push_back(0);
for(int times=0;times<5;times++)
dmat[k][i][j][l].push_back(0);
}
if(j){
mat[0][i][j][0][0]=1;
mat[0][i][j][1^i][1]=2;
mat[1][i][j][1][0]=1;
mat[1][i][j][1^i][1]=2;
}else{
mat[0][i][j][0][0]=1;
mat[1][i][j][1][0]=1;
mat[i][i][j][1^i][1]=1;
mat[i][i][j][1^i][2]=1;
}
}
init();
calcsmall();
for(int i=0;i<2;i++)
for(int j=0;j<2;j++){
if(j){
mat[0][i][j][1^i][1]=0;
mat[1][i][j][1^i][1]=0;
mat[0][i][j][i][1]=2;
mat[1][i][j][i][1]=2;
}else{
mat[i][i][j][i^1][1]=0;
mat[i][i][j][i^1][2]=0;
mat[i^1][i][j][i][1]=1;
mat[i^1][i][j][i][2]=1;
}
}
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
for(int k=0;k<2;k++){
for(int l=0;l<2;l++)
for(int o=0;o<3;o++)
for(int ll=0;ll<2;ll++)
for(int oo=0;oo<3;oo++)
dmat[i][j][k][ll][o+oo]+=mat[i][j][k][l][o]*mat[l][j^1][(k-o+2)%2][ll][oo];
dmat[i][j][k][i][0]--;
for(int ll=0;ll<2;ll++)
for(int oo=1;oo<3;oo++)
dmat[i][j][k][ll][oo]-=mat[1^i][j^1][k][ll][oo];
}
for(int D=4;D<=d;D++)
for(int k=0;k<2;k++){
for(int i=0;i<2;i++)
for(int j=1;j<5;j++)
if(D-j||j!=4)
dpn[k][D]+=dpn[i][D-j]*dmat[k^1][n%2][D%2][i][j];
dpn[k][D]-=calc(D-1,k);
dpn[k][D]=(dpn[k][D]%mod+mod)%mod;
}
int ans=(dpn[0][d]+dpn[1][d])%mod;
if(d%2)ans=1ll*ans*(mod+1)/2%mod;
cout<<ans;
}#include<bits/stdc++.h>
using namespace std;
const int mod=998244353,ggg=3,invggg=(mod+1)/ggg;
int n,d;
struct matr{
int n,m;
vector<vector<int> >v;
void init(int nn,int mm){
n=nn;m=mm;
vector<int>q;
for(int i=0;i<m;i++)
q.push_back(0);
for(int i=0;i<n;i++)
v.push_back(q);
}
};
matr mul(matr a,matr b){
matr ret;ret.init(a.n,b.m);
for(int i=0;i<a.n;i++)
for(int k=0;k<b.n;k++)
for(int j=0;j<b.m;j++)
ret.v[i][j]=(ret.v[i][j]+1ll*a.v[i][k]*b.v[k][j])%mod;
return ret;
}
matr Mypow(matr a,int times){
if(times==1)
return a;
matr ret=Mypow(a,times/2);
ret=mul(ret,ret);
if(times&1)
ret=mul(ret,a);
return ret;
}
const int maxn=262144;
int tmp[maxn],F[maxn],G[maxn];
long long mypow(long long x,int y){
long long ret=1;
while(y){
if(y&1)ret=ret*x%mod;
y>>=1;x=x*x%mod;
}return ret;
}
int revs[maxn];
void initrev(int Len){
for(int i=1;i<Len;++i){
revs[i]=revs[i>>1]>>1;
if(i&1)revs[i]|=(Len>>1);
}
}
void DFT(int *f,int n,int rev){
int g0=rev==1?ggg:invggg;
initrev(n);
for(register int i=0;i<n;++i)
if(i<revs[i])
f[i]^=f[revs[i]]^=f[i]^=f[revs[i]];
for(register int h=2;h<=n;h<<=1){
int gn=mypow(g0,(mod-1)/h);
for(register int j=0;j<n;j+=h){
int gk=1;
for(register int k=j;k<j+(h>>1);++k){
int e=f[k],o=1ll*gk*f[k+(h>>1)]%mod;
f[k]=(e+o)%mod,f[k+(h>>1)]=(e+mod-o)%mod;
gk=1ll*gk*gn%mod;
}
}
}
if(rev==-1){
int invv=mypow(n,mod-2);
for(register int i=0;i<n;++i)
f[i]=1ll*f[i]*invv%mod;
}
}
long long dpn[2][100003];
vector<int>mat[2][2][2][2],dmat[2][2][2][2];
int f[2][200003],g[2][200003],h[2][200003],ff[262144],gg[262144],hh[262144];
void init(){
long long nw=1,x=(n+1)/2,y=(n+1)/2;
for(int i=0;i<=d;i++){
f[0][i]=nw;
if(i%2==0)
g[0][i]=nw;
else
h[0][i]=nw;
if(i<=n+1)
if((n+1-i)%2==0)
nw=nw*y%mod,
y--,
nw=nw*mypow(x-y,mod-2)%mod;
else
x++,
nw=nw*x%mod,
nw=nw*mypow(x-y,mod-2)%mod;
else break;
}nw=1;x=n/2;y=n/2;
for(int i=0;i<=d;i++){
f[1][i]=nw;
if(i%2==0)
g[1][i]=nw;
else
h[1][i]=nw;
if(i<=n)
if((n-i)%2==0)
nw=nw*y%mod,
y--,
nw=nw*mypow(x-y,mod-2)%mod;
else
x++,
nw=nw*x%mod,
nw=nw*mypow(x-y,mod-2)%mod;
else break;
}
for(int i=0;i<=d;i++)
F[i]=f[0][i],
G[i]=f[1][i];
DFT(F,maxn,1);
DFT(G,maxn,1);
for(int i=0;i<maxn;i++)
F[i]=1ll*F[i]*G[i]%mod;
DFT(F,maxn,-1);
for(int i=0;i<maxn;i++)
ff[i]=F[i];
for(int i=0;i<maxn;i++)F[i]=0,G[i]=0;
for(int i=0;i<=d;i++)
F[i]=g[0][i],
G[i]=h[1][i];
DFT(F,maxn,1);
DFT(G,maxn,1);
for(int i=0;i<maxn;i++)
F[i]=1ll*F[i]*G[i]%mod;
DFT(F,maxn,-1);
for(int i=0;i<maxn;i++)
gg[i]=F[i];
for(int i=0;i<maxn;i++)F[i]=0,G[i]=0;
for(int i=0;i<=d;i++)
F[i]=g[1][i],
G[i]=h[0][i];
DFT(F,maxn,1);
DFT(G,maxn,1);
for(int i=0;i<maxn;i++)
F[i]=1ll*F[i]*G[i]%mod;
DFT(F,maxn,-1);
for(int i=0;i<maxn;i++)
hh[i]=F[i];
}
int calc(int D,int qaq){
if(qaq==1)
return (ff[D]-hh[D]+mod)%mod;
else
return (ff[D]-gg[D]+mod)%mod;
}
int QAQ(int x,int y){
if(x==0)
return min(1,y);
return y;
}
void calcsmall(){
matr fr,time0,time1;
fr.init(1,8);
fr.v[0][4]=1;
time0.init(8,8);
time1.init(8,8);
for(int i=0;i<2;i++)
for(int j=0;j<4;j++)
for(int k=0;k<2;k++)
for(int l=0;l<=min(1,j);l++)
time0.v[k*4+j-l][i*4+j]=QAQ(j-l,mat[i][0][j%2][k][l]);
for(int i=0;i<2;i++)
for(int j=0;j<4;j++)
for(int k=0;k<2;k++)
for(int l=0;l<=min(1,j);l++)
time1.v[k*4+j-l][i*4+j]=QAQ(j-l,mat[i][1][j%2][k][l]);
time0.v[4][0]=1;
time1.v[0][4]=1;
if(n/2)
fr=mul(fr,Mypow(mul(time0,time1),n/2));
if(n%2)
fr=mul(fr,time0);
for(int i=0;i<8;i++)
dpn[i/4][i%4]=fr.v[0][i];
}
int main(){
cin>>n>>d;
for(int i=0;i<2;i++)
for(int j=0;j<2;j++){
for(int k=0;k<2;k++)
for(int l=0;l<2;l++){
for(int times=0;times<3;times++)
mat[k][i][j][l].push_back(0);
for(int times=0;times<5;times++)
dmat[k][i][j][l].push_back(0);
}
if(j){
mat[0][i][j][0][0]=1;
mat[0][i][j][1^i][1]=2;
mat[1][i][j][1][0]=1;
mat[1][i][j][1^i][1]=2;
}else{
mat[0][i][j][0][0]=1;
mat[1][i][j][1][0]=1;
mat[i][i][j][1^i][1]=1;
mat[i][i][j][1^i][2]=1;
}
}
init();
calcsmall();
for(int i=0;i<2;i++)
for(int j=0;j<2;j++){
if(j){
mat[0][i][j][1^i][1]=0;
mat[1][i][j][1^i][1]=0;
mat[0][i][j][i][1]=2;
mat[1][i][j][i][1]=2;
}else{
mat[i][i][j][i^1][1]=0;
mat[i][i][j][i^1][2]=0;
mat[i^1][i][j][i][1]=1;
mat[i^1][i][j][i][2]=1;
}
}
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
for(int k=0;k<2;k++){
for(int l=0;l<2;l++)
for(int o=0;o<3;o++)
for(int ll=0;ll<2;ll++)
for(int oo=0;oo<3;oo++)
dmat[i][j][k][ll][o+oo]+=mat[i][j][k][l][o]*mat[l][j^1][(k-o+2)%2][ll][oo];
dmat[i][j][k][i][0]--;
for(int ll=0;ll<2;ll++)
for(int oo=1;oo<3;oo++)
dmat[i][j][k][ll][oo]-=mat[1^i][j^1][k][ll][oo];
}
for(int D=4;D<=d;D++)
for(int k=0;k<2;k++){
for(int i=0;i<2;i++)
for(int j=1;j<5;j++)
if(D-j||j!=4)
dpn[k][D]+=dpn[i][D-j]*dmat[k^1][n%2][D%2][i][j];
dpn[k][D]-=calc(D-1,k);
dpn[k][D]=(dpn[k][D]%mod+mod)%mod;
}
int ans=(dpn[0][d]+dpn[1][d])%mod;
if(d%2)ans=1ll*ans*(mod+1)/2%mod;
cout<<ans;
}*/
詳細信息
Subtask #1:
score: 1
Accepted
Test #1:
score: 1
Accepted
time: 121ms
memory: 14320kb
input:
1 1
output:
1
result:
ok single line: '1'
Test #2:
score: 1
Accepted
time: 128ms
memory: 14820kb
input:
2 1
output:
2
result:
ok single line: '2'
Test #3:
score: 1
Accepted
time: 133ms
memory: 14908kb
input:
3 2
output:
3
result:
ok single line: '3'
Test #4:
score: 1
Accepted
time: 129ms
memory: 14264kb
input:
4 4
output:
5
result:
ok single line: '5'
Test #5:
score: 1
Accepted
time: 120ms
memory: 12620kb
input:
5 7
output:
2
result:
ok single line: '2'
Test #6:
score: 1
Accepted
time: 133ms
memory: 15168kb
input:
6 4
output:
41
result:
ok single line: '41'
Test #7:
score: 1
Accepted
time: 118ms
memory: 14212kb
input:
7 11
output:
2
result:
ok single line: '2'
Test #8:
score: 1
Accepted
time: 121ms
memory: 14312kb
input:
8 8
output:
175
result:
ok single line: '175'
Test #9:
score: 1
Accepted
time: 133ms
memory: 14500kb
input:
9 10
output:
298
result:
ok single line: '298'
Test #10:
score: 1
Accepted
time: 125ms
memory: 14320kb
input:
10 3
output:
392
result:
ok single line: '392'
Test #11:
score: 1
Accepted
time: 132ms
memory: 14924kb
input:
11 8
output:
3785
result:
ok single line: '3785'
Test #12:
score: 1
Accepted
time: 133ms
memory: 14384kb
input:
12 15
output:
1422
result:
ok single line: '1422'
Test #13:
score: 1
Accepted
time: 120ms
memory: 13152kb
input:
13 17
output:
2008
result:
ok single line: '2008'
Test #14:
score: 1
Accepted
time: 128ms
memory: 15216kb
input:
14 16
output:
21508
result:
ok single line: '21508'
Test #15:
score: 1
Accepted
time: 125ms
memory: 14772kb
input:
15 1
output:
1596
result:
ok single line: '1596'
Test #16:
score: 1
Accepted
time: 120ms
memory: 12600kb
input:
16 28
output:
29
result:
ok single line: '29'
Test #17:
score: 1
Accepted
time: 120ms
memory: 12528kb
input:
17 6
output:
98086
result:
ok single line: '98086'
Test #18:
score: 1
Accepted
time: 124ms
memory: 12732kb
input:
18 11
output:
1478534
result:
ok single line: '1478534'
Test #19:
score: 1
Accepted
time: 133ms
memory: 14820kb
input:
19 25
output:
250068
result:
ok single line: '250068'
Test #20:
score: 1
Accepted
time: 122ms
memory: 14244kb
input:
20 27
output:
355418
result:
ok single line: '355418'
Test #21:
score: 1
Accepted
time: 129ms
memory: 14512kb
input:
21 23
output:
13517834
result:
ok single line: '13517834'
Test #22:
score: 1
Accepted
time: 127ms
memory: 14184kb
input:
22 4
output:
315460
result:
ok single line: '315460'
Test #23:
score: 1
Accepted
time: 125ms
memory: 14452kb
input:
23 37
output:
18428
result:
ok single line: '18428'
Test #24:
score: 1
Accepted
time: 129ms
memory: 14528kb
input:
24 18
output:
647287901
result:
ok single line: '647287901'
Test #25:
score: 1
Accepted
time: 124ms
memory: 13096kb
input:
25 40
output:
136655
result:
ok single line: '136655'
Subtask #2:
score: 7
Accepted
Test #26:
score: 7
Accepted
time: 133ms
memory: 14316kb
input:
380 59
output:
718355613
result:
ok single line: '718355613'
Test #27:
score: 7
Accepted
time: 129ms
memory: 14928kb
input:
164 46
output:
353450103
result:
ok single line: '353450103'
Test #28:
score: 7
Accepted
time: 128ms
memory: 14876kb
input:
206 144
output:
910367339
result:
ok single line: '910367339'
Test #29:
score: 7
Accepted
time: 126ms
memory: 14164kb
input:
270 127
output:
78796015
result:
ok single line: '78796015'
Test #30:
score: 7
Accepted
time: 133ms
memory: 14748kb
input:
157 87
output:
705420296
result:
ok single line: '705420296'
Subtask #3:
score: 10
Accepted
Test #31:
score: 10
Accepted
time: 129ms
memory: 15184kb
input:
413 652
output:
170600118
result:
ok single line: '170600118'
Test #32:
score: 10
Accepted
time: 121ms
memory: 12868kb
input:
724 979
output:
677376486
result:
ok single line: '677376486'
Test #33:
score: 10
Accepted
time: 133ms
memory: 14252kb
input:
1667 1699
output:
147640784
result:
ok single line: '147640784'
Test #34:
score: 10
Accepted
time: 132ms
memory: 14844kb
input:
1980 517
output:
276583672
result:
ok single line: '276583672'
Test #35:
score: 10
Accepted
time: 121ms
memory: 12656kb
input:
2000 2000
output:
265422351
result:
ok single line: '265422351'
Subtask #4:
score: 14
Accepted
Test #36:
score: 14
Accepted
time: 130ms
memory: 14488kb
input:
4495 4498
output:
375585699
result:
ok single line: '375585699'
Test #37:
score: 14
Accepted
time: 129ms
memory: 14672kb
input:
4968 2196
output:
844161053
result:
ok single line: '844161053'
Test #38:
score: 14
Accepted
time: 122ms
memory: 12576kb
input:
3967 3143
output:
496535114
result:
ok single line: '496535114'
Test #39:
score: 14
Accepted
time: 129ms
memory: 15012kb
input:
2406 4205
output:
599052202
result:
ok single line: '599052202'
Test #40:
score: 14
Accepted
time: 118ms
memory: 14196kb
input:
3942 3259
output:
110001226
result:
ok single line: '110001226'
Subtask #5:
score: 19
Accepted
Test #41:
score: 19
Accepted
time: 133ms
memory: 14568kb
input:
158314621 32
output:
465741961
result:
ok single line: '465741961'
Test #42:
score: 19
Accepted
time: 133ms
memory: 14476kb
input:
456573367 93
output:
310185347
result:
ok single line: '310185347'
Test #43:
score: 19
Accepted
time: 125ms
memory: 12536kb
input:
638787498 62
output:
467767457
result:
ok single line: '467767457'
Test #44:
score: 19
Accepted
time: 117ms
memory: 14424kb
input:
752253598 48
output:
110045639
result:
ok single line: '110045639'
Test #45:
score: 19
Accepted
time: 126ms
memory: 14064kb
input:
992442354 76
output:
330338775
result:
ok single line: '330338775'
Subtask #6:
score: 36
Accepted
Test #46:
score: 36
Accepted
time: 130ms
memory: 14080kb
input:
812922977 1762
output:
927995257
result:
ok single line: '927995257'
Test #47:
score: 36
Accepted
time: 133ms
memory: 14464kb
input:
661518393 1247
output:
469311509
result:
ok single line: '469311509'
Test #48:
score: 36
Accepted
time: 131ms
memory: 14828kb
input:
562238351 1811
output:
157645249
result:
ok single line: '157645249'
Test #49:
score: 36
Accepted
time: 125ms
memory: 14456kb
input:
985149295 62
output:
137919742
result:
ok single line: '137919742'
Test #50:
score: 36
Accepted
time: 130ms
memory: 14872kb
input:
983061012 3695
output:
893431185
result:
ok single line: '893431185'
Subtask #7:
score: 13
Accepted
Test #51:
score: 13
Accepted
time: 141ms
memory: 14864kb
input:
320076133 78121
output:
395290254
result:
ok single line: '395290254'
Test #52:
score: 13
Accepted
time: 137ms
memory: 15416kb
input:
446896560 77255
output:
351855538
result:
ok single line: '351855538'
Test #53:
score: 13
Accepted
time: 137ms
memory: 14168kb
input:
119010844 13459
output:
267420251
result:
ok single line: '267420251'
Test #54:
score: 13
Accepted
time: 149ms
memory: 16064kb
input:
974106901 92469
output:
455361665
result:
ok single line: '455361665'
Test #55:
score: 13
Accepted
time: 135ms
memory: 14504kb
input:
776878732 25173
output:
929444986
result:
ok single line: '929444986'