【前言】
疯狂做概率期望.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. 内核变量——Jiffies
  2. arduino上ESP8266用Adafruit_SSD1306库驱动OLED屏
  3. CSP认证201604-2 俄罗斯方块[C++题解]:模拟、枚举
  4. 移动端向服务端提交数据——实现简单登录
  5. linux---基础04
  6. Linux学习笔记006----Linux命令ps使用详解
  7. Notepad++配置Python运行环境
  8. 2020 Pwn2Own东京大赛落幕,Master of Pwn 诞生
  9. 前端面试题大集合:来自真实大厂的532道面试题(只有题,没有答案)
  10. msiafterburner并行配置不正确_dubbo常用配置及使用场景
  11. python求第三边长_如何用python求第三条边边长
  12. 社交网络分析算法应用,社交网络分析算法
  13. 称重仪表显示ol怎么解决_地磅称重时仪表显示出现跳数如何解决?
  14. Vue组件动态(异步)传值
  15. java layoutinflater_LayoutInflater-使用
  16. android手机不能发短信,解决安卓手机发送短信失败的方法
  17. Exponential family: 指数分布族
  18. 语音机器人空号识别介绍
  19. python中的乘方_python乘方运算
  20. 如何开通微信商城?微商城的开通方法?

热门文章

  1. c语言开发与游戏时间,都9012年了,为何我用C语言开发游戏(是的,C语言)
  2. CountDownLatch原理详解
  3. H5发起支付并并跳转到支付页面
  4. 她的十年开源路:只管热爱,无问西东
  5. 初级程序员闲暇之余,应该如何提升自我?
  6. 闯荡江湖的必备指南(3)
  7. python代码接口实现
  8. 符号_ai怎么添加自己制作的符号?ai怎么添加符号新的符号?
  9. Shiro整合SSO单点登录系统
  10. 父亲节借势营销,品牌应该如何策划?