P9823 [ICPC2020 Shanghai R] The Journey of Geor Autumn 题解
SunsetLake · · 题解
思路
注意到题目中的限制条件是
于是考虑
但是直接求是
复杂度
code
#include<bits/stdc++.h>
#define ll long long
#define pb push_back
using namespace std;
const int N = 1e7 + 5,mod = 998244353;
int n,k;
ll f[N],sum[N],fac[N],inv[N];
ll qpow(ll x,ll y){
ll res = 1;
while(y){
if(y & 1) res = res * x % mod;
x = x * x % mod;
y >>= 1;
}
return res;
}
ll C(ll x,ll y){
if(x < y || x < 0 || y < 0) return 0;
return fac[x] * inv[y] % mod * inv[x - y] % mod;
}
int main(){
cin >> n >> k;
fac[0] = inv[0] = 1;
for(int i = 1;i <= n;++ i) fac[i] = fac[i - 1] * i % mod;
inv[n] = qpow(fac[n],mod - 2);
for(int i = n - 1;i >= 1;-- i) inv[i] = inv[i + 1] * (i + 1) % mod;
f[0] = sum[0] = 1;
for(int i = 1;i <= n;++ i){
f[i] = sum[i - 1];
if(i - 1 - k >= 0) f[i] = (f[i] - sum[i - k - 1] + mod) % mod;
f[i] = f[i] * fac[i - 1] % mod;
sum[i] = (sum[i - 1] + f[i] * inv[i] % mod) % mod;
}
cout << f[n];
return 0;
}