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

Itst
没钩选手瑟瑟发抖搬运于
2025-08-24 22:04:24,当前版本为作者最后更新于2018-09-30 22:58:58,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
Update On 2020.07.07: 优化阅读体验
题意简述:有 个选项,最开始随机蒙,会进行 次删除操作,必须在其中 次删除操作后更换自己选择的答案,求最优策略下选到正确答案的概率。
前置知识:概率、有理数取余(不会戳这里)
不妨先考虑直接确定是否选中正解的最后一次更换。设最后一次更换时包括当前选择的选项共有 个选项,前 次更换获得错解的概率为 ,那么更换后选到正确答案的概率就是 。当 确定时, 越小,概率越高。也就是说最后一次更换安排在最后一次删除后,就有 的概率选到正解,这个概率显然是最高的。
那么需要考虑 如何取得最大值。类似地,设第 次更换时剩下 个选项,前 次更换获得错解的概率为 ,那么当前选到错误答案的概率是 。当 确定时, 越大,获得错解的概率越高。
那么可以得到最优策略:在前 次删出错解后更换,第 次更换放在最后一次删除错解之后。利用上面的式子可以将概率算出来。
小心 0 的特判。
#include<bits/stdc++.h> #define MOD 100000007 using namespace std; inline int poww(long long a , int b){ long long times = 1; while(b){ if(b & 1) times = times * a % MOD; a = a * a % MOD; b >>= 1; } return times; } int main(){ int n , k; scanf("%d%d" , &n , &k); if(k == 0) cout << poww(n , MOD - 2); else{ k--; long long fz = n - 1 , fm = n; n -= 2; while(k){ fz = ((fm = fm * n % MOD) - fz) % MOD; k--; n--; } cout << fz * poww(fm , MOD - 2) % MOD; } return 0; }
- 1
信息
- ID
- 3796
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 5
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者