公式实现:
ans=(ans+((a[n]*POW(p,i,MOD))*POW((1-p+MOD),n-i,MOD))*POW(a[i]*a[n-i],MOD-2,MOD)
a[i]为阶乘;
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<iostream>
#include<cstring>
#include<set>
#include<map>
#include<iterator>
#include<queue>
#include<vector>
#include<string>
using namespace std;
typedef long long LL;
const int N=1e6+10;
const long long INF=1e18;
const double eps=0.0000001;
LL a[N];
const LL MOD=998244353;
LL POW(LL a, LL b, LL p){//a的b次方求余p
LL ret = 1;
while(b){
if(b & 1) ret = (ret * a) % p;
a = (a * a) % p;
b >>= 1;
}
return ret;
}
int main()
{
a[1]=1;
a[0]=1;
LL n,p,k,ans;
for(int i=2;i<N;i++)//求阶乘
a[i]=(a[i-1]*i)%MOD;
scanf("%lld%lld%lld",&n,&k,&p);
ans=0;
for(int i=k;i<=n;i++)
{
ans=(ans+((a[n]*POW(p,i,MOD)%MOD)*POW((1-p+MOD)%MOD,n-i,MOD)%MOD)*POW(a[i]*a[n-i]%MOD,MOD-2,MOD)%MOD)%MOD;
}
cout<<ans<<endl;
}