CF1809G 题解
dAniel_lele · · 题解
不难发现比赛一定是设初始胜者为
设
考虑
考虑
总复杂度
#include <bits/stdc++.h>
#define int long long
#define s(i,j) ((i-1)*m+j)
#define add(i,j) ((i+j>=mod)?i+j-mod:i+j)
using namespace std;
const int mod=998244353;
int a[1000005],p[1000005],fac[1000005],inv[1000005];
int dp[1000005],pre[1000005];
int qp(int a,int b){
int ans=1;
while(b){
if(b&1) (ans*=a)%=mod;
(a*=a)%=mod;
b>>=1;
}
return ans;
}
void init(){
fac[0]=1; for(int i=1;i<=1000000;i++) fac[i]=fac[i-1]*i%mod;
inv[1000000]=qp(fac[1000000],mod-2); for(int i=999999;i>=0;i--) inv[i]=inv[i+1]*(i+1)%mod;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
init();
int n,k; cin>>n>>k; for(int i=1;i<=n;i++) cin>>a[i];
if(a[n]-a[n-1]<=k){
cout<<0;
return 0;
}
for(int i=1;i<=n;i++) p[i]=lower_bound(a+1,a+n+1,a[i]-k)-a;
dp[0]=1,pre[0]=fac[n-1];
for(int i=1;i<=n;i++){
(dp[i]+=pre[p[i]-1]*inv[n-p[i]])%=mod;
pre[i]=(pre[i-1]+dp[i]*fac[n-p[i]-1])%mod;
}
cout<<dp[n];
return 0;
}