Description

Zeit und Raum trennen dich und mich.
时空将你我分开。B 君在玩一个游戏,这个游戏由 n 个灯和 n 个开关组成,给定这 n 个灯的初始状态,下标为
从 1 到 n 的正整数。每个灯有两个状态亮和灭,我们用 1 来表示这个灯是亮的,用 0 表示这个灯是灭的,游戏
的目标是使所有灯都灭掉。但是当操作第 i 个开关时,所有编号为 i 的约数(包括 1 和 i)的灯的状态都会被
改变,即从亮变成灭,或者是从灭变成亮。B 君发现这个游戏很难,于是想到了这样的一个策略,每次等概率随机
操作一个开关,直到所有灯都灭掉。这个策略需要的操作次数很多, B 君想到这样的一个优化。如果当前局面,
可以通过操作小于等于 k 个开关使所有灯都灭掉,那么他将不再随机,直接选择操作次数最小的操作方法(这个
策略显然小于等于 k 步)操作这些开关。B 君想知道按照这个策略(也就是先随机操作,最后小于等于 k 步,使
用操作次数最小的操作方法)的操作次数的期望。这个期望可能很大,但是 B 君发现这个期望乘以 n 的阶乘一定
是整数,所以他只需要知道这个整数对 100003 取模之后的结果。

Input

第一行两个整数 n, k。
接下来一行 n 个整数,每个整数是 0 或者 1,其中第 i 个整数表示第 i 个灯的初始情况。
1 ≤ n ≤ 100000, 0 ≤ k ≤ n;

Output

输出一行,为操作次数的期望乘以 n 的阶乘对 100003 取模之后的结果。

Sample Input

4 0
0 0 1 1

Sample Output

512

Solution

看完题面就觉得这题非常的丧。
先考虑不随机按按钮的情况。
我们发现在最优情况下,我们按编号从大到小的顺序关灯,这样的步数是最小的,因为编号小的灯的按钮开关不会影响编号大的灯的开关,这样最坏情况下我们只要按 nnn 次就可以关闭所有灯。
然后我们发现, 50%" role="presentation" style="position: relative;">50%50%50\% 的数据 k=nk=nk = n,这不是送分吗,先打了再说。
就按编号从大到小 forforfor 一遍, 如果这盏灯是开着的把所有编号为它的因数的灯都按一遍,最后统计就可以了。
如果我们求出的最优解 StepStepStep 大于 kkk 该怎么办呢。
我们设 f[i]" role="presentation" style="position: relative;">f[i]f[i]f[i] 为我们需要按 iii 次按钮时能结束的期望步数。
易得我们有 in" role="presentation" style="position: relative;">inin\frac{i}{n} 的概率按到我们需要的按钮 n−inn−in\frac{n - i}{n} 的概率按到我们不需要的按钮。
于是 f[i]=in×f[i−1]+n−in×f[i+1]+1f[i]=in×f[i−1]+n−in×f[i+1]+1f[i] = \frac{i}{n} \times f[i - 1] + \frac{n - i}{n} \times f[i + 1] + 1.
然而我们发现,我们最多有 n−1n−1n - 1 个方程而要求解 nnn 个变量,这显然是不可行的。
所以我们把 f" role="presentation" style="position: relative;">fff 数组差分一下, 设 g[i]=f[i]−f[i−1]g[i]=f[i]−f[i−1]g[i] = f[i] - f[i - 1]。
整理得 g[i]=n+(n−i)×f[i+1]ig[i]=n+(n−i)×f[i+1]ig[i] = \frac{n + (n - i) \times f[i + 1]}{i}
最后答案为 k+∑Stepi=k+1g[i]k+∑i=k+1Stepg[i]k + \sum_{i = k + 1}^{Step} g[i]

Code

#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <iostream>
#include <queue>
#include <set>
#include <stack>#define R register
#define ll long long
#define db double
#define sqr(_x) (_x) * (_x)
#define Cmax(_a, _b) ((_a) < (_b) ? (_a) = (_b), 1 : 0)
#define Cmin(_a, _b) ((_a) > (_b) ? (_a) = (_b), 1 : 0)
#define Max(_a, _b) ((_a) > (_b) ? (_a) : (_b))
#define Min(_a, _b) ((_a) < (_b) ? (_a) : (_b))
#define Abs(_x) (_x < 0 ? (-(_x)) : (_x))using namespace std;namespace Dntcry
{inline int read(){R int a = 0, b = 1; R char c = getchar();for(; c < '0' || c > '9'; c = getchar()) (c == '-') ? b = -1 : 0;for(; c >= '0' && c <= '9'; c = getchar()) a = (a << 1) + (a << 3) + c - '0';return a * b;}inline ll lread(){R ll a = 0, b = 1; R char c = getchar();for(; c < '0' || c > '9'; c = getchar()) (c == '-') ? b = -1 : 0;for(; c >= '0' && c <= '9'; c = getchar()) a = (a << 1) + (a << 3) + c - '0';return a * b;}const int Maxn = 100010, Mod = 100003;int n, k;int v[Maxn];ll f[Maxn], test, Ans, fac, inv[Maxn];int Main(){n = read(), k = read();fac = inv[0] = inv[1] = 1; for(R int i = 1; i <= n; i++) v[i] = read(), fac = 1ll * fac * i % Mod;for(R int i = n; i > 0; i--) if(v[i]) {R int lim = (int)sqrt(i);++test;for(R int j = 1; j <= lim; j++) if(i % j == 0) {v[j] ^= 1;if(j * j != i) v[i / j] ^= 1;}}if(test <= k) return !printf("%lld\n", test * fac % Mod);for(R int i = 2; i <= n; i++) inv[i] = (Mod - Mod / i) * inv[Mod % i] % Mod;f[n] = 1;for(R int i = n - 1; i >= k; i--) f[i] = 1ll * (n + 1ll * (n - i) * f[i + 1] % Mod) * inv[i] % Mod;for(R int i = test; i > k; i--) Ans = (Ans + f[i]) % Mod;Ans += k;printf("%lld\n", Ans * fac % Mod);return 0;}
}
int main()
{return Dntcry :: Main();
}

[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]分手是祝愿

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

  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. oracle procedures批量删除带索引条件数据很慢_见微知著,数据库应用设计优化浅谈...
  2. VC++深入详解 孙鑫 高清PDF + 配套视频下载
  3. 怎么在linux指定目录下查找文件夹下,Linux下如何使用find命令指定目录查找文件...
  4. 笛卡尔集基本原理,等值连接,不等值连接,外连接,自连接
  5. 牛客网_PAT乙级1001_A+B和C (15)
  6. 小米MIX 4真机亮屏谍照曝光:四边框极窄,震撼
  7. java抓取动态生成的网页
  8. jQuery 语法总结和注意事项
  9. 如何证明永动机不可能制造出来
  10. YOLO-V3可视化
  11. SCADA数采HAAS数控系统现场实操步骤
  12. 基于vb的mysql管理系统代码_VB ACCESS高校财务管理系统[论文 源代码 可执行程序]...
  13. 忒修斯之船,你还是原来的你吗?
  14. 松下MINAS-A6伺服电机调试记录
  15. SQL Server 2008 R2 安装 (转)
  16. 铁丝石笼网厂家批发@拥抱心中有爱的春天
  17. Selenium使用浏览器自动登录校园网
  18. 天线巴伦制作和原理_传输线巴伦的原理设计制作及测试
  19. 合肥python儿童编程_合肥少儿编程学习中心
  20. JS 0~~100以内能被3整除也能被5整除的个数和总和

热门文章

  1. android 通达信 数据接口,通达OA移动版完美兼容iOS/Android操作系统
  2. rto净化效率计算公式_吕梁油墨厂RTO焚烧炉设计计算
  3. 2021年中国焚化炉市场趋势报告、技术动态创新及2027年市场预测
  4. STEM教育 or steam教育 art
  5. 高通平台android kernel 开机logo显示和传统linux一样 .
  6. Three.JS学习 3:Threejs画网格
  7. 三星电视测试屏幕的软件有哪些,附文:我们如何测试屏幕?_三星 UA65F9000_液晶电视评测-中关村在线...
  8. 使用jupyter中的matplotlib库绘制简单图表4
  9. 【Unity面板属性扫盲】导入模型后属性设置之——Rig 选项卡
  10. systemd-journal-flush.service 有什么用?,加快开机速度