【前言】
疯狂做概率期望.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} fi​ni​fi​fi​​=ni​+nn−i​(1+fi+1​+fi​)=1+nn−i​fi+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] 分手是祝愿相关推荐

  1. BZOJ4872 [SHOI2017]分手是祝愿

    大家都很强, 可与之共勉 . 题意:    B君在玩一个游戏,这个游戏由N个灯和N个开关组成,给定这N个灯的初始状态,下标为从1到N的正整数.每个灯有两个状态亮和灭,我们用1来表示这个灯是亮的,用0表 ...

  2. 4872: [Shoi2017]分手是祝愿

    4872: [Shoi2017]分手是祝愿 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 153 Solved: 109 [Submit][Statu ...

  3. bzoj 4872 [Shoi2017]分手是祝愿

    4872: [Shoi2017]分手是祝愿 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 138 Solved: 97 [Submit][Status ...

  4. 【BZOJ4872】分手是祝愿

    分手是祝愿 [题目大意] 有n 个灯,每个灯有两个状态亮和灭,我们用 1 来表示这个灯是亮的,用 0 表示这个灯是灭的,操作第 i 个开关时,所有编号为 i 的约数(包括 1 和 i)的灯的状态都会被 ...

  5. [SHOI2017]分手是祝愿

    题目: https://ac.nowcoder.com/acm/problem/20437 有nnn盏灯,111表示开的,000表示关的.每次操作随机选一个开关i(1≤i≤n)i(1\le i\le ...

  6. [SHOI2017] 分手是祝愿

    Description Zeit und Raum trennen dich und mich. 时空将你我分开.B 君在玩一个游戏,这个游戏由 n 个灯和 n 个开关组成,给定这 n 个灯的初始状态 ...

  7. bzoj 4872: [Shoi2017]分手是祝愿

    题意 时空将你我分开.B 君在玩一个游戏,这个游戏由 n 个灯和 n 个开关组成,给定这 n 个灯的初始状态,下标为从 1 到 n 的正整数.每个灯有两个状态亮和灭,我们用 1 来表示这个灯是亮的,用 ...

  8. BZOJ 4872 luogu P3750 [六省联考2017]分手是祝愿

    4872: [Shoi2017]分手是祝愿 Time Limit: 20 Sec  Memory Limit: 512 MB [Submit][Status][Discuss] Description ...

  9. 2017 [六省联考] T5 分手是祝愿

    4872: [Shoi2017]分手是祝愿 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 458  Solved: 299 [Submit][Sta ...

最新文章

  1. python采集修改原创_python应用系列教程——python中ftp操作:连接、登录、获取目录,重定向、上传下载,删除更改...
  2. c++ 树的先序、中序和后序的非递归实现(附完整源码)
  3. Spring Boot 笔记汇总
  4. C++ lower_bound 与 upper_bound 函数
  5. resnet18 结构
  6. 使用 PDBDownloader 解决 IDA 加载 ntoskrnl.exe 时符号不完全问题
  7. Flutter时间轴(timeline)
  8. 极客大学架构师训练营 系统架构 高并发 高可用 垂直伸缩 水平伸缩 第7课 听课总结
  9. SpringBoot自动装配原理与自己写一个starter
  10. 可以测试流放之路伤害的软件,流放之路:游戏难点!你知道平均每秒伤害(DPS)怎么计算吗!...
  11. R语言与Python对比
  12. 【长期维护】程序员锻炼法则
  13. 移动端的vm vh是什么
  14. win10系统 DNS服务器,Win10系统DNS服务器无响应
  15. 猿创征文|【算法入门必刷】数据结构-栈(二)
  16. 基于MATLAB平台实现红绿灯(交通灯)识别
  17. 3_IMX6ULL启动流程
  18. [VBA学习]如何在Excel的下拉选中显示多选?
  19. 最新版NASA官方网站数据下载流程——以MODIS数据演示为例
  20. 对象存储OSS之阿里云OSS介绍及开通

热门文章

  1. 二进制(四):二进制如何转换为八进制、十六进制
  2. 老婆童装店今天升5钻
  3. 【苹果家庭推】软件安装设置Save for iOS App Store Deployment
  4. 网吧破解DOS提示符
  5. c++游戏大厅(不定时更新)
  6. java ayyay.sort_oss-sdk-java/README.md at master · demonDH/oss-sdk-java · GitHub
  7. 如何运行编好的Android程序,3. 编写的第一个android HelloWorld程序如何在手机上面调试运行...
  8. java实现系统中控件类图_阅读以下关于某订单管理系统的技术说明、部分UML类图及Java程序,将Jav..._考试资料网...
  9. oracle翻译甲骨文,甲骨文
  10. [ArchLinux] 搜狗拼音输入法的安装