【期望】BZOJ4872 [SHOI2017] 分手是祝愿
【前言】
疯狂做概率期望.jpg
【题目】
一个游戏由nnn盏灯和nnn个开关组成,给定初始灯的状态(亮或灭)。当操作第iii个开关,则会将所有编号为iii的约数的灯状态取反。当可以通过≤k\leq k≤k次操作灭掉全部灯,就按顺序操作使灯状态改变,否则随机操作。求期望操作次数。n,k≤105n,k\leq 10^5n,k≤105,答案对100003100003100003取模。
【解题思路】
首先一个状态下的最少次数我们显然可以从高位开始贪心,我们可以记下初始状态需要的操作次数cntcntcnt(我们称为正确的操作)。
那么实际上我们可以设计一个DP\text{DP}DP,fif_ifi表示还有iii个正确的操作时,能变成i−1i-1i−1个正确操作的期望操作步数,那么
fi=in+n−in(1+fi+1+fi)infi=1+n−infi+1fi=n+(n−i)fi+1i\begin{aligned} f_i&=\frac{i}{n}+\frac{n-i}{n}(1+f_{i+1}+f_i)\\ \frac{i}{n}f_i&=1+\frac{n-i}{n}f_{i+1}\\ f_i&=\frac{n+(n-i)f_{i+1}}{i} \end{aligned} finififi=ni+nn−i(1+fi+1+fi)=1+nn−ifi+1=in+(n−i)fi+1
具体意义显然,时间复杂度O(nn)O(n\sqrt n)O(nn)(预处理出cntcntcnt)
【参考代码】
#include<bits/stdc++.h>
using namespace std;typedef long long ll;
const int N=1e5+10,mod=100003;
int n,K,ans,cnt;
int a[N],f[N];int read()
{int ret=0;char c=getchar();while(!isdigit(c)) c=getchar();while(isdigit(c)) ret=ret*10+(c^48),c=getchar();return ret;
}
void change(int x)
{for(int i=1;i*i<=x;++i){if(!(x%i)) {if(i*i==x) a[i]^=1;else a[i]^=1,a[x/i]^=1;}}
}
int qpow(int x,int y)
{int res=1;for(;y;y>>=1,x=(ll)x*x%mod) if(y&1) res=(ll)res*x%mod;return res;
}
void up(int &x,int y){x+=y;if(x>=mod)x-=mod;}int main()
{#ifndef ONLINE_JUDGEfreopen("BZOJ4872.in","r",stdin);freopen("BZOJ4872.out","w",stdout);
#endifn=read();K=read();for(int i=1;i<=n;++i) a[i]=read();for(int i=n;i;--i) if(a[i]) change(i),++cnt;if(K>=cnt) ans=cnt;else{ for(int i=n;i>K;--i) f[i]=(ll)(n+(ll)(n-i)*f[i+1])%mod*qpow(i,mod-2)%mod;for(int i=cnt;i>K;--i) up(ans,f[i]);up(ans,K);}for(int i=1;i<=n;++i) ans=(ll)ans*i%mod;printf("%d\n",ans);return 0;
}
【期望】BZOJ4872 [SHOI2017] 分手是祝愿相关推荐
- BZOJ4872 [SHOI2017]分手是祝愿
大家都很强, 可与之共勉 . 题意: B君在玩一个游戏,这个游戏由N个灯和N个开关组成,给定这N个灯的初始状态,下标为从1到N的正整数.每个灯有两个状态亮和灭,我们用1来表示这个灯是亮的,用0表 ...
- 4872: [Shoi2017]分手是祝愿
4872: [Shoi2017]分手是祝愿 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 153 Solved: 109 [Submit][Statu ...
- bzoj 4872 [Shoi2017]分手是祝愿
4872: [Shoi2017]分手是祝愿 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 138 Solved: 97 [Submit][Status ...
- 【BZOJ4872】分手是祝愿
分手是祝愿 [题目大意] 有n 个灯,每个灯有两个状态亮和灭,我们用 1 来表示这个灯是亮的,用 0 表示这个灯是灭的,操作第 i 个开关时,所有编号为 i 的约数(包括 1 和 i)的灯的状态都会被 ...
- [SHOI2017]分手是祝愿
题目: https://ac.nowcoder.com/acm/problem/20437 有nnn盏灯,111表示开的,000表示关的.每次操作随机选一个开关i(1≤i≤n)i(1\le i\le ...
- [SHOI2017] 分手是祝愿
Description Zeit und Raum trennen dich und mich. 时空将你我分开.B 君在玩一个游戏,这个游戏由 n 个灯和 n 个开关组成,给定这 n 个灯的初始状态 ...
- bzoj 4872: [Shoi2017]分手是祝愿
题意 时空将你我分开.B 君在玩一个游戏,这个游戏由 n 个灯和 n 个开关组成,给定这 n 个灯的初始状态,下标为从 1 到 n 的正整数.每个灯有两个状态亮和灭,我们用 1 来表示这个灯是亮的,用 ...
- BZOJ 4872 luogu P3750 [六省联考2017]分手是祝愿
4872: [Shoi2017]分手是祝愿 Time Limit: 20 Sec Memory Limit: 512 MB [Submit][Status][Discuss] Description ...
- 2017 [六省联考] T5 分手是祝愿
4872: [Shoi2017]分手是祝愿 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 458 Solved: 299 [Submit][Sta ...
最新文章
- python采集修改原创_python应用系列教程——python中ftp操作:连接、登录、获取目录,重定向、上传下载,删除更改...
- c++ 树的先序、中序和后序的非递归实现(附完整源码)
- Spring Boot 笔记汇总
- C++ lower_bound 与 upper_bound 函数
- resnet18 结构
- 使用 PDBDownloader 解决 IDA 加载 ntoskrnl.exe 时符号不完全问题
- Flutter时间轴(timeline)
- 极客大学架构师训练营 系统架构 高并发 高可用 垂直伸缩 水平伸缩 第7课 听课总结
- SpringBoot自动装配原理与自己写一个starter
- 可以测试流放之路伤害的软件,流放之路:游戏难点!你知道平均每秒伤害(DPS)怎么计算吗!...
- R语言与Python对比
- 【长期维护】程序员锻炼法则
- 移动端的vm vh是什么
- win10系统 DNS服务器,Win10系统DNS服务器无响应
- 猿创征文|【算法入门必刷】数据结构-栈(二)
- 基于MATLAB平台实现红绿灯(交通灯)识别
- 3_IMX6ULL启动流程
- [VBA学习]如何在Excel的下拉选中显示多选?
- 最新版NASA官方网站数据下载流程——以MODIS数据演示为例
- 对象存储OSS之阿里云OSS介绍及开通
热门文章
- 二进制(四):二进制如何转换为八进制、十六进制
- 老婆童装店今天升5钻
- 【苹果家庭推】软件安装设置Save for iOS App Store Deployment
- 网吧破解DOS提示符
- c++游戏大厅(不定时更新)
- java ayyay.sort_oss-sdk-java/README.md at master · demonDH/oss-sdk-java · GitHub
- 如何运行编好的Android程序,3. 编写的第一个android HelloWorld程序如何在手机上面调试运行...
- java实现系统中控件类图_阅读以下关于某订单管理系统的技术说明、部分UML类图及Java程序,将Jav..._考试资料网...
- oracle翻译甲骨文,甲骨文
- [ArchLinux] 搜狗拼音输入法的安装