#include #include #include using namespace atcoder; using mint = modint998244353; using namespace std; #define rep(i,n) for (int i = 0; i < (n); ++i) #define Inf32 1000000000 #define Inf64 1000000000000000001LL vector mul(vector a,vector b){ /* vector c(a.size()+b.size()-1,0); rep(i,a.size()){ rep(j,b.size()){ c[i+j] += a[i]*b[j]; } } return c; */ return convolution(a,b); } mint Bostan_Mori(vector a,vector c,long long n){ while(a.size()>=c.size())c.push_back(0); while(n!=0){ auto cinv = c; for(int i=1;i na; for(int i=(n&1LL);i nc; for(int i=0;i>=1; } return a[0]; } void solve2(int N,int K){ vector dp(N,vector(2,0)); rep(i,N){ dp[i][0]++; if(i-K-1>=0)dp[i][0] += dp[i-K-1][1]; if(i>0)dp[i][1] += dp[i-1][0] + dp[i-1][1]; if(i-K-1>=0)dp[i][1] -= dp[i-K-1][0] + dp[i-K-1][1]; rep(j,2){ if(i!=0)dp[i][j] += dp[i-1][j]; } } mint ans = 0; rep(i,N){ if(i==0)continue; ans += dp[i][1]-dp[i-1][1];; } ans++; cout<>N>>K; if(N<=500000){ solve2(N,K); return 0; } vector t(K*3+1); t[0]++; mint ans = 0; rep(i,K){ long long x = i+K+1; if(x > N-1){ ans++; } else{ t[x+1] --; } } t = convolution(t,t); vector ff(K*2+2); ff[0] = 1; ff[1] -= 2; ff[K*2+1] ++; mint res = Bostan_Mori(t,ff,N); //cout<