[题目链接]

https://www.lydsy.com/JudgeOnline/problem.php?id=4872

[算法]

首先发现 , 对于一个开关 , 按下2次和没按是等价的 , 因此每个开关最多按一次

考虑k = n的情况 , 只需简单倒序贪心即可

考虑随机的情况 , 由观察可知一个开关不能由多个开关组合得到

用fi表示i次将所有开关变关到(i - 1)次将所有开关变关的期望步数

有转移方程fi = i / n + (1 - i / n) * (1 + fi + 1 + fi)

将该转移方程看作一个一元一次方程 , 即可解出fi

不再赘述 , 详见代码

时间复杂度 : O(N)

[代码]

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
const int P = 100003;
const int N = 100010;int n , k , cnt;
int a[N] , inv[N] , dp[N];
vector< int > D[N];template <typename T> inline void chkmax(T &x,T y) { x = max(x,y); }
template <typename T> inline void chkmin(T &x,T y) { x = min(x,y); }
template <typename T> inline void read(T &x)
{T f = 1; x = 0;char c = getchar();for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;for (; isdigit(c); c = getchar()) x = (x << 3) + (x << 1) + c - '0';x *= f;
}int main()
{read(n); read(k);for (int i = 1; i <= n; ++i) read(a[i]);inv[1] = 1;for (int i = 2; i <= n; ++i) inv[i] = 1ll * (P - P / i) * inv[P % i] % P;for (int i = 1; i <= n; ++i){for (int j = i; j <= n; j += i){D[j].push_back(i);}    }for (int i = n; i >= 1; --i){if (a[i]){for (unsigned j = 0; j < D[i].size(); ++j)a[D[i][j]] ^= true;++cnt;}}int ans = 0;if (cnt <= k)ans = cnt;else{dp[n] = 1;for (int i = n - 1; i >= 1; --i) dp[i] = (1ll * dp[i + 1] * (n - i) % P * inv[i] % P + 1ll * n * inv[i] % P) % P;for (int i = cnt; i > k; --i) ans = (ans + dp[i]) % P;ans = (ans + k) % P;}for (int i = 1; i <= n; ++i) ans = 1ll * ans * i % P;printf("%d\n" , ans);return 0;}

转载于:https://www.cnblogs.com/evenbao/p/10623825.html

[SHOI 2017] 分手是祝愿相关推荐

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

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

  2. [六省联考2017]分手是祝愿(期望+DP)

    题解 很容易想出来最优策略是什么. 就是从n到1看到开着的灯就把它关了 我们预处理出当前状态把灯全部关闭后的最少步数cnt 然后我们的主人公就要瞎按... 设dp[i]代表当前状态最优解为i步时走到d ...

  3. P3750-[六省联考2017]分手是祝愿【期望dp】

    正题 题目链接:https://www.luogu.org/problem/P3750 题目大意 nnn盏灯和按钮,每次随机选择一个xxx按下后会让xxx的倍数的灯都取反,然后若最少kkk步就可以将所 ...

  4. 洛谷 P3750 [六省联考2017]分手是祝愿

    传送门 题解 //Achen #include<algorithm> #include<iostream> #include<cstring> #include&l ...

  5. luogu P3750 [六省联考 2017]分手是祝愿

    https://www.luogu.com.cn/problem/P3750 k=nk=nk=n给了808080分可还行 首先考虑k=nk=nk=n,不难想到一个贪心,从大到小枚举每个开关,如果为11 ...

  6. P3750 [六省联考2017]分手是祝愿(期望概率,返祖模型)

    题意:给n个灯,初始化下给出每个灯的状态,给n个开关,操作开关i会使得编号是i的约数的灯的状态翻转一次,现在有一个种算法,如果当前状态下可以操作k次及以下就能使所有灯熄灭,直接操作这个次数,游戏结束, ...

  7. [六省联考2017]分手是祝愿 题解

    题目传送门 题目大意: 给出一排灯泡的状态,每次修改一个灯泡时会将它编号的约数的灯泡的状态同时修改,现在随机修改灯泡,当按照最优策略还有 kkk 次操作就能全灭时就按最优策略,问期望操作次数. 题解 ...

  8. BZOJ 4872 六省联考2017 分手是祝愿

    Problem BZOJ Solution 感觉dp状态的设置好巧妙啊 首先要明确的是怎么计算最小步数.就是直接从n到1扫,如果有亮着的,就按这个开关,模拟一下是O(nlnn)O(nln⁡n)O(n\ ...

  9. [六省联考2017]分手是祝愿 - 题解

    题目链接 做法: 首先预处理出每个数的约数,用 $ vector $ 存,时间是调和级数 $ O(n \log n) $ . 部分分:当 $ n = k $ 时,每次操作最优,然后从右往左枚举,若果当 ...

最新文章

  1. RDD, DataFrame or Dataset
  2. 巨省显存的重计算技巧在TF、Keras中的正确打开方式
  3. BZOJ 3083: 遥远的国度(树链剖分+DFS序)
  4. 如何选择数据分析工具
  5. sun键盘没有stop键_【转帖】SUN基础知识
  6. 联想win11出现wifi图标消失
  7. 计算机应用基础学生指导评语,计算机应用基础评课稿范本
  8. h5页面如何预览excel文件_在网页中预览word和excel
  9. PT100恒流源电路及仿真
  10. Lake Shore—224 型温度监测器
  11. jsp中空格字符怎么写_jsp多个空格符号怎么打
  12. 计算机使用技巧爆文,自媒体原创(伪原创)爆文的写作技巧
  13. Ubuntu linux下运行xv6
  14. RabitMQ系列之 Spring RabbitMQ流量削锋实现案例之抢红包
  15. 两个时间之间的有多少个工作日,有多少天,有多少天的周末
  16. 7-3 sdust-Java-字符串集合求并集 (10分)
  17. GPU与CPU、显卡区别
  18. 三菱Q系列与FANUC发那科CC-LINK通讯案例
  19. 现货黄金注意避免频繁交易
  20. MySQL中 any,some,all 的用法

热门文章

  1. C语言 递归函数实现二分查找
  2. Linux内核争抢式并发在SMP多核扩展上的不足
  3. word表格中自动插入行编号
  4. 什么是苹果推信?什么是苹果推?
  5. 局域网上网行为管理系统可以为企业带来什么优势?
  6. python中的类class及self详解
  7. 建设銀行信用卡电子账单
  8. Qt下实现欧姆龙PLC 串口发送HOSTLINK(FINS)模式
  9. superset集成echarts,自定义图表开发
  10. 基于一维度卷积网络的的近红外光谱建模