1 条题解
-
0
自动搬运
来自洛谷,原作者为

Protons
消灭[数据删除]暴政,世界属于[数据删除]搬运于
2025-08-24 22:06:57,当前版本为作者最后更新于2019-11-09 17:43:22,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
题解思路:正难则反
我们发现,因为该期望的概率数列是个不收敛数列,所以要想顺着题目的思路去推出期望几乎是不可能的,因此我们要另辟蹊径
引理:
求证:
假设对于一件事,我们每一次做时的成功率是,如果本次不成功就继续做,最终期望次做成
证明:
对于这个问题,我们显然不能正向去想,我们可以利用一个叫做递归公式的东西:我们设期望次做成 ,则有:
其中1表示第一次做,如果成功了就再做0次,期望次数为;如果不成功就再做次,期望为
通过移项,我们得到
引理证毕
正文:
我们先来思考一个问题:从个球里取出1个球的概率是多少
答案很简单,显然是1,由引理得,取出1个球成功的期望次数为
那从个球中取出其他个球中的一个球的概率呢?其实也很好算,就是,那成功的期望次数就是
以此类推……………………
则取遍这个球的总期望次数为:$k_{sum}=k_1+k_2+\text{…}+k_n=\dfrac{n}{n}+\dfrac{n}{n-1}+\text{…}+\dfrac{n}{1}=n*\sum\limits_{i=1}^{n-1}\dfrac{1}{n-i}$
所以最终这个题就是求个逆元和乘就完事了
附加证明:线性筛逆元
我们知道,对于任意一个数,都有(为任意整数)
则对于式子
我们有
把挪到右边:
两边同时乘的逆元:
两边再同时乘的逆元:
即可化为
同时,我们知道,在c++里,类的除法都是自动向下取整的。所以我们可以得到:对于数,有、(我们要求的是的逆元,是模数)。我们设为的逆元,则有递推式:
证毕
以下是code:
#include<cstdio> #include<iostream> using namespace std; typedef long long ll; const int p=20040313; ll inv[10000010],sum,n; int main() { scanf("%lld",&n); inv[1]=1;sum+=1; for(int i=2;i<=n;i++)//简短有力 inv[i]=(1ll*(p-p/i)*inv[p%i])%p,sum=(sum+inv[i])%p; printf("%lld",n*sum%p); return 0; }
- 1
信息
- ID
- 3910
- 时间
- 1000ms
- 内存
- 250MiB
- 难度
- 5
- 标签
- (无)
- 递交数
- 0
- 已通过
- 0
- 上传者