可以说官方题解除了恶心其他人和告诉你这题不难之外没有任何作用。
考虑期望的线性性,可以将每一个跳蛙的每一个亡语单独考虑。
令\(f_n\)代表剩余\(n\)个随从,其中有一个是只有一个亡语的跳蛙的答案。
于是就有:\(f_n=\frac{1}{n}(kf_{n-1}+k)+\frac{n-1}{n}f_{n-1}\)
递推公式:\(f_n+\frac{k-1}{k}=\frac{n+k-1}{n}(f_{n-1}+\frac{k-1}{k})\)
通项同时:\(f_n=\frac{(k+n-1)!}{n!k!}(k+\frac{k}{k-1})-\frac{k}{k-1}\)
然后递推求通项公式就行了。
#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;
#define int long long
const int p=998244353;
int read(){
int sum=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){sum=sum*10+ch-'0';ch=getchar();}
return sum*f;
}
int ksm(int x,int b){
int ans=1;
while(b){
if(b&1)ans=ans*x%p;
b>>=1;
x=x*x%p;
}
return ans;
}
signed main(){
int T=read();
while(T--){
int n=read(),m=read();
int tmp=1;
int fac=1;
for(int i=2;i<=m;i++){
int w=i*ksm(i-1,p-2)%p;
tmp=tmp*(n+i-1)%p;
fac=fac*i%p;
cout<<(tmp*(i+w)%p*ksm(fac,p-2)%p-w+p)%p<<endl;
}
}
return 0;
}
标签:杭电多校,ch,frac,int,read,while,2022,1005,include
From: https://www.cnblogs.com/Xu-daxia/p/16610851.html