文章目录
- 题目描述
- 解析
- 代码
题目描述
解析
首先有一个很重要的引理:
若一件事做成的概率是p,则其做成需要次数的期望是1/p
为什么呢?
我们设做成这件事的期望次数是x
就可以列出方程:
x=1+p∗0+(1−p)∗xx=1+p*0+(1-p)*xx=1+p∗0+(1−p)∗x
解得x=1/p
得到这个结论后我们会到本题
若已经拿出了k个不同的小球,再拿出1个不同小球的概率是:
(n−k)/n(n-k)/n(n−k)/n
那么其期望就是:
n/(n−k)n/(n-k)n/(n−k)
然后答案就是令k从1枚举到n-1,也就是
n∗∑1/i(1<=i<=n)n*∑1/i(1<=i<=n)n∗∑1/i(1<=i<=n)
线性求逆元即可
代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e7+100;
const int mod=20040313;
ll ni[N];
ll ans=0;
int n;
int main(){scanf("%d",&n);ni[1]=1;ans=n;for(int i=2;i<=n;i++){ni[i]= ni[mod%i]*(mod-mod/i)%mod;ni[i]%=mod;// if(ni[i]<0) ni[i]+=mod;ans=(ans+ni[i]*n)%mod;}printf("%lld\n",ans);return 0;
}
/**/