题目:
https://ac.nowcoder.com/acm/problem/20437

有nnn盏灯,111表示开的,000表示关的。每次操作随机选一个开关i(1≤i≤n)i(1\le i\le n)i(1≤i≤n),对于所有的j(j∣i)j(j|i)j(j∣i),第jjj盏灯的状态反转。如果当前在最优的情况下只需要x(x≤k)x(x\le k)x(x≤k)个开关就能使所有的灯关掉,则按照最优的情况进行操作。求关掉所有灯的期望次数。

思路:

  • 首先考虑如何对于一个状态求最小步数。
    由于编号小的开关不会影响到后面的灯,所以应该按编号从大到小决策。对于当前枚举到的灯iii,如果它是开着的,那么必须使用开关iii。所以可以很快求出对于初始状态的步数。
  1. 最优情况每个开关最多操作一次,所以最优情况最多为nnn。
  2. 最优操作的顺序没有关系。
  3. 最优操作唯一(不考虑顺序)
  • dp[i]dp[i]dp[i]表示在最优情况下还需要iii次操作才能把所有灯关掉的状态到完成态的期望操作次数。(因为关掉一盏灯会影响还需要的最优步数)那么接下来有in\frac{i}{n}ni​的概率到达最优情况下还要i−1i-1i−1次操作的状态,n−in\frac{n-i}{n}nn−i​的概率到达i+1i+1i+1的状态。(如果使用的就是最优策略的iii个开关中的一个,那么最优次数减111,否则加111)
    dp[i]={in⋅dp[i−1]+n−in⋅dp[i+1]+1(k<i≤n)①i(i≤k)②dp[i]= \begin{cases} \frac{i}{n}\cdot dp[i-1]+\frac{n-i}{n}\cdot dp[i+1]+1(k<i\le n)\quad①\\ i(i\le k)\quad②\\ \end{cases} dp[i]={ni​⋅dp[i−1]+nn−i​⋅dp[i+1]+1(k<i≤n)①i(i≤k)②​
    设初始最优要numnumnum次,则dp[0]=0dp[0]=0dp[0]=0,dp[num]dp[num]dp[num]为答案。
  1. 解方程组,时间复杂度太高
  2. 看成数列,构造
    dp[i]=in⋅dp[i−1]+n−in⋅dp[i+1]+1in⋅(dp[i]−dp[i−1])=n−in⋅(dp[i+1]−dp[i])+1令dp[i]−dp[i−1]=f[i]f[i]=n−ii⋅f[i+1]+nif[n]=1k<i≤n\begin{aligned} dp[i]&=\frac{i}{n}\cdot dp[i-1]+\frac{n-i}{n}\cdot dp[i+1]+1\quad\\ \frac{i}{n}\cdot(dp[i]-dp[i-1])&=\frac{n-i}{n}\cdot(dp[i+1]-dp[i])+1\quad令dp[i]-dp[i-1]=f[i]\\ f[i]&=\frac{n-i}{i}\cdot f[i+1]+\frac{n}{i}\quad f[n]=1\quad k<i\le n\\ \end{aligned} dp[i]ni​⋅(dp[i]−dp[i−1])f[i]​=ni​⋅dp[i−1]+nn−i​⋅dp[i+1]+1=nn−i​⋅(dp[i+1]−dp[i])+1令dp[i]−dp[i−1]=f[i]=in−i​⋅f[i+1]+in​f[n]=1k<i≤n​
    从后往前递推f[i]f[i]f[i]。如果num>k,dp[num]=dp[k]+∑i=k+1numf[i]num>k,dp[num]=dp[k]+\sum_{i=k+1}^{num}f[i]num>k,dp[num]=dp[k]+∑i=k+1num​f[i]
#include <cstdio>
#include <cstring>
#include <algorithm>using namespace std;const int N=100005,mo=100003;typedef long long LL;int n,Fac[N],C[N],m,k,bz[N],Inv[N],ans;char c;int read()
{int x=0,sig=1;for (c=getchar();c<'0' || c>'9';c=getchar()) if (c=='-') sig=-1;for (;c>='0' && c<='9';c=getchar()) x=x*10+c-48;return x*sig;
}int main()
{n=read(); k=read();for (int i=1;i<=n;i++) bz[i]=read();for (int i=n;i;i--) if (bz[i]){m++;for (int j=1;j*j<=i;j++) if (i%j==0){bz[j]^=1;if (i/j>j) bz[i/j]^=1;}}Fac[0]=Fac[1]=Inv[1]=1;for (int i=2;i<=n;i++){Fac[i]=(LL)Fac[i-1]*i%mo;Inv[i]=(LL)Inv[mo%i]*(mo-mo/i)%mo;}if (k>=m){printf("%d\n",(LL)Fac[n]*m%mo);return 0;}C[0]=1;for (int i=0;i<n;i++) C[i+1]=(LL)C[i]*(n-i)%mo*Inv[i+1]%mo;for (int i=1;i<=n;i++) C[i]=(C[i]+C[i-1])%mo;for (int i=k+1;i<=m;i++) ans=(ans+(LL)Fac[n-i]*Fac[i-1]%mo*(C[n]-C[i-1]))%mo;if (ans<0) ans+=mo;ans=(LL)ans*n%mo;ans=(ans+(LL)Fac[n]*k)%mo;printf("%d\n",ans);return 0;
}

[SHOI2017]分手是祝愿相关推荐

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

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

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

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

  3. BZOJ4872 [SHOI2017]分手是祝愿

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

  4. [SHOI2017] 分手是祝愿

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

  5. 【期望】BZOJ4872 [SHOI2017] 分手是祝愿

    [前言] 疯狂做概率期望.jpg [题目] 一个游戏由nnn盏灯和nnn个开关组成,给定初始灯的状态(亮或灭).当操作第iii个开关,则会将所有编号为iii的约数的灯状态取反.当可以通过≤k\leq ...

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

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

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

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

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

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

  9. LOJ#2145. 「SHOI2017」分手是祝愿

    LOJ#2145. 「SHOI2017」分手是祝愿 题目描述 Solution 首先有一个结论: 灯的状态序列a1,a2...ana_1,a_2...a_na1​,a2​...an​唯一对应了一个最优 ...

最新文章

  1. 华人斩获最佳Demo论文,Bengio获时间检验奖,最佳论文突破NLP传统测试方法 | ACL 2020...
  2. MPY634U 四象限模拟乘法器
  3. 怎样知道一个数是不是2的N次方,怎样判断一个数是奇数还是偶数
  4. 成功解决TypeError: tuple indices must be integers or slices, not str
  5. 80x86描述符总结及解析描述符的小程序
  6. ARM64的启动过程之(一):内核第一个脚印
  7. Unable to simultaneously satisfy constraints.
  8. [转]一个软件设计的全过程(基于UML)
  9. doc命令操作数据库(下)
  10. Docker系列(二)Docker安装与启动
  11. Linq to Oracle 使用教程目录
  12. python 使用 ipx协议_Samba 服务使用的端口和协议
  13. [转载] 高校两院院士名单
  14. Ps抠图(小白教程)
  15. 对 torch 中 dim 的总结和理解
  16. IPSec ×××实验
  17. Layui树形表格组件的实现
  18. 感恩节已经过了,但我们的感恩不能过去...
  19. php动态网站开发测评试题,智慧职教PHP动态网站开发单元测试答案
  20. CRC16校验的原理

热门文章

  1. SGE 和 Slurm对比
  2. Photoshop:常用快捷键整理,提高工作效率,你也可以零基础成为PS高手
  3. Lightbox弹出层插件:jQuery弹出层插件用法
  4. GPUImage美颜视频录制
  5. Nebulas 101 - 03 编写并运行智能合约 ---》星云链开发
  6. Android 悬浮窗语音识别功能开发详解
  7. Java下载模板文件(Excel demo)
  8. JSP中out内置对象的使用
  9. kali linux 命令行设置WIFI
  10. 计算机网络学习框架-网络体系-习题复习