提交时间:2025-10-27 19:15:11
运行 ID: 38785
#include<bits/stdc++.h> using namespace std; #define ll long long bool AAA; int read(){int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f;} const int MAXN=1000010,N=62,B=500,B2=2*B*B,Mod=998244353; void add(int &x,int y){x+=y;if(x>=Mod)x-=Mod;} int n,w,f[B*2+5][B*2+5],ans; void sol1(){ int tmp=B*2+3; for(int i=1;i<=B;i++)f[i][i]=1; for(int i=1;i<n;i++){ for(int j=1;j<=2*B;j++)if(f[i%tmp][j]){ if(i+j+1<=n)add(f[(i+j+1)%tmp][j+1],(ll)f[i%tmp][j]*w%Mod); if(j>1&&i+j-1<=n)add(f[(i+j-1)%tmp][j-1],f[i%tmp][j]); f[i%tmp][j]=0; } } for(int i=1;i<=2*B;i++)add(ans,f[n%tmp][i]); } int g[B2*2+10],g1[B2*2+10],h[B2*2+10]; void sol2(){ g[B2]=1; for(int i=1;i<=B;i++){ // for(int j=-i;j<=i;j++)add(h[j-i*i+B2],g[j+B2]),add(h[j+i*(j+1)+B2],g[j+B2]); // for(int j=-B2+i;j<=B2;j++)add(h[j+B2],h[j-i+B2]); // cout<<i<<":"; // for(int j=-B2;j<=B2;j++)cout<<g[j+B2]<<" ";cout<<endl; // for(int j=-B2;j<=B2;j++)cout<<h[j+B2]<<" ";cout<<endl; for(int j=B+1;i*(2*j-i+1)/2<=n;j++)if(abs(i*j-n)<=B2)add(ans,g[n-i*j+B2]); for(int j=-B2;j<=B2;j++){ if(j-i>=-B2)add(g1[j-i+B2],g[j+B2]); if(j+i<=B2)add(g1[j+i+B2],(ll)g[j+B2]*w%Mod); } for(int j=-B2;j<=B2;j++)g[j+B2]=g1[j+B2],g1[j+B2]=0; } } void slv(){ n=read(),w=read(); sol1(); sol2(); printf("%lld",ans); } bool BBB; signed main(){ // freopen("1.in","r",stdin);freopen("1.out","w",stdout); slv(); // cerr<<(clock()*1.0)/CLOCKS_PER_SEC<<"s\n"; // cerr<<((&AAA)-(&BBB))/1024.0/1024<<"MB\n"; return 0; }