洛谷P3750 [六省联考2017]分手是祝愿(期望dp)
嗯……概率期望这东西太神了……
先考虑一下最佳方案,肯定是从大到小亮的就灭(这个仔细想一想应该就能发现)
那么直接一遍枚举就能$O(nlogn)$把这个东西给搞出来
然后考虑期望dp,设$f[i]$表示从$i$个正确选项中选择一个正确的变为$i-1$个的期望次数
那么$$f[i]=\frac{i}{n}+(1-\frac{i}{n})*(1+f[i+1]+f[i])$$
其中$\frac{i}{n}$表示一次就选了正确的选项,$(1-\frac{i}{n})$表示按错了,那么会增加一个正确选项,然后这个时候要按回去次数是$(1+f[i+1]+f[i])$,然后再加上按错的一次
那么移项可得$$f[i]=1+\frac{(n-i)*(f[i]+1)+1}{n}$$
然后只要从后往前递推就可以了
//minamoto
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[<<],*p1=buf,*p2=buf;
inline int read(){
#define num ch-'0'
char ch;bool flag=;int res;
while(!isdigit(ch=getc()))
(ch=='-')&&(flag=true);
for(res=num;isdigit(ch=getc());res=res*+num);
(flag)&&(res=-res);
#undef num
return res;
}
const int N=,mod=;
int b[N];vector<int> g[N];
int f[N],inv[N],n,k;
void solve(){
int ans=,tp=;
for(int i=;i<=n;++i)
for(int j=i;j<=n;j+=i)
g[j].push_back(i);
for(int i=n;i;--i)
if(b[i]){
++tp;
for(int j=,s=g[i].size();j<s;++j) b[g[i][j]]^=;
}
if(tp<=k) ans=tp;
else{
f[n]=;
for(int i=n-;i;--i) f[i]=(1ll+1ll*(n-i)*(f[i+]+)*inv[i])%mod;
for(int i=tp;i>k;--i) (ans+=f[i])%=mod;
(ans+=k)%=mod;
}
for(int i=;i<=n;++i) ans=1ll*ans*i%mod;
printf("%d\n",ans);
}
int main(){
// freopen("testdata.in","r",stdin);
n=read(),k=read();
for(int i=;i<=n;++i) b[i]=read();
inv[]=;
for(int i=;i<=n;++i) inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;
solve();
return ;
}
洛谷P3750 [六省联考2017]分手是祝愿(期望dp)的更多相关文章
- 洛谷 P3750 [六省联考2017]分手是祝愿
传送门 题解 //Achen #include<algorithm> #include<iostream> #include<cstring> #include&l ...
- [bzoj4872] [洛谷P3750] [六省联考2017] 分手是祝愿
Description Zeit und Raum trennen dich und mich. 时空将你我分开. \(B\) 君在玩一个游戏,这个游戏由 \(n\) 个灯和 \(n\) 个开关组成, ...
- 洛谷 P3750 - [六省联考2017]分手是祝愿(期望 dp)
题面传送门 首先我们需注意到这样一个性质:那就是对于任何一种状态,将其变为全 \(0\) 所用的最小步数的方案是唯一的--考虑编号为 \(n\) 的灯,显然如果它原本是暗着的就不用管它了,如果它是亮着 ...
- P3750 [六省联考2017]分手是祝愿 期望DP
\(\color{#0066ff}{ 题目描述 }\) Zeit und Raum trennen dich und mich. 时空将你我分开. B 君在玩一个游戏,这个游戏由 \(n\) 个灯和 ...
- [BZOJ4872][六省联考2017]分手是祝愿(期望DP)
4872: [Shoi2017]分手是祝愿 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 516 Solved: 342[Submit][Statu ...
- [六省联考2017]分手是祝愿 期望DP
表示每次看见期望的题就很懵逼... 但是这题感觉还是值得一做,有可借鉴之处 要是下面这段文字格式不一样的话(虽然好像的确不一样,我也不知道为什么,是直接从代码里面复制出来的,因为我一般都是习惯在代码里 ...
- [六省联考2017]分手是祝愿——期望DP
原题戳这里 首先可以确定的是最优策略一定是从大到小开始,遇到亮的就关掉,因此我们可以\(O(nlogn)\)的预处理出初始局面需要的最小操作次数\(tot\). 然后容(hen)易(nan)发现即使加 ...
- BZOJ 4872 luogu P3750 [六省联考2017]分手是祝愿
4872: [Shoi2017]分手是祝愿 Time Limit: 20 Sec Memory Limit: 512 MB[Submit][Status][Discuss] Description ...
- luogu P3750 [六省联考2017]分手是祝愿
luogu loj 可以发现在最优策略中,每种操作最多只会做一次,并且操作的先后顺序并不会影响答案,所以考虑从后往前扫,碰到一个\(1\)就对这个位置\(i\)进行操作,这样的操作一定是最优策略.记最 ...
随机推荐
- cdcqの省选膜你赛 题解
题解: 第一题: 有一个很明显的性质:后面的修改不会对前面的询问做出影响,CDQ分治套上BIT即可. 第二题: 有一个类似于斜率的形式,分数规划套上树分治,码量稍大,细节稍多. 最后20W的点出题人原 ...
- Android系统Gps分析(一)【转】
本文转载自:http://blog.csdn.net/xnwyd/article/details/7198728 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 1 G ...
- eclipse批量修改package、import中的包名
问题:想把以前开发的包,用到新项目中,怎么操作呢? 解决方案: 把文件夹复制到新项目包中,同时需要更改很多package.import中的包名第一步:打开一个java文件,选中要替换的字段: 第二步: ...
- zabbix 上 mysql 优化
摘自: https://segmentfault.com/a/1190000001638101
- iOS数据持久化存储之属性列表
属性列表(plist) iOS提供了一种plist格式的文件(属性列表)用于存储轻量级的数据,属性列表是一种XML格式的文件,拓展名为plist.如果对象是NSString.NSDictionary. ...
- python关于文件路径和文件名的操作
os.path.abspath(path) #返回绝对路径(包含文件名的全路径) os.path.basename(path) —— 去掉目录路径获取文件名 os.path.dirname(path) ...
- excel根据数据源变化的动态图表
http://www.excelhome.net/lesson/article/excel/1798.html 这个链接讲的可以.
- Linux_配置_02_配置dns
二.参考资料 1.centOS 7 设置DNS方法 同之前版本不同
- (转)epoll非阻塞读写规则
EPOLL技术 在linux的网络编程中,很长的时间都在使用select来做事件触发.在linux新的内核中,有了一种替换它的机制,就是epoll.相比于select,epoll最大的好处在于它不会随 ...
- 「LOJ#10036」「一本通 2.1 练习 2」Seek the Name, Seek the Fame (Hash
题目描述 原题来自:POJ 2752 给定若干字符串(这些字符串总长 ≤4×105 \le 4\times 10^5 ≤4×105),在每个字符串中求出所有既是前缀又是后缀的子串长度. 例如:abab ...