这两天遇到不少这种“人类智慧题”了,感觉都是很巧妙的

Description

link

现在有 \(n\) 盏灯,设每一次操作控制第 \(i\) 占灯,而改变状态的灯就是 \(i\) 的所有约数

现在给定初始的灯的状态序列,求剩余k次操作,就把灯全部关闭的步数期望\(+k\)和\(n!\) 的乘积

答案对 \(10003\) 取模

\(n \leq 10^5\)

Solution

思路分析

上来我们看到了“期望”,直接想到这题要 \(dp\)

然后定义状态是个难题(下面没有扯淡了)

\(f[i]\) 表示离全关掉还有 \(i\) 步走到离全关掉还有 \(i-1\) 步的期望操作次数。(这里是重点)

转移的时候考虑两种情况:

\(1^0\) 一次性摁对了,这种情况有\(\frac{i}{n}\)的概率

\(2^0\) 一次摁不对,需要转到\(i+1\)的状态

所以转移方程直接给出

\[f[i]=\frac{i}{n}+\frac{f[i+1] \times (n-i) }{n}
\]

整理得:

\[f[i]=\frac{n+(n-i) \times f[i+1]}{i}
\]

算法流程

最后给出本题流程:

1.\(O(n \sqrt n)\) 预处理因数的个数

2.从后往前扫一下,看一共需要几次完成游戏(特判如果\(cnt \leq k\),就直接乘上阶乘走人就好)

3.跑一下上面的 \(dp\),\(O(n)\)的,也不用优化

逆元啥的不会先去学板子吧

4.最后记得成阶乘

Code

#include <bits/stdc++.h>
using namespace std;
#define int long long
namespace yspm {
inline int read() {
int res = 0, f = 1;
char k;
while (!isdigit(k = getchar()))
if (k == '-')
f = -1;
while (isdigit(k)) res = res * 10 + k - '0', k = getchar();
return res * f;
}
const int N = 1e5 + 10;
vector<int> vec[N];
int n, k, f[N], mod = 100003, now[N], cnt, fac = 1, ans;
inline void prework() {
for (int i = 1; i <= n; ++i) {
for (int j = i; j <= n; j += i) vec[j].push_back(i);
}
for (int i = n; i >= 1; --i)
if (now[i]) {
++cnt;
int sz = vec[i].size();
for (int j = 0; j < sz; ++j) now[vec[i][j]] = !now[vec[i][j]];
}
return;
}
inline int ksm(int x, int y) {
int res = 1;
for (; y; y >>= 1) {
if (y & 1)
(res *= x) %= mod;
(x *= x) %= mod;
}
return res;
}
inline int inv(int x) { return ksm(x, mod - 2); }
signed main() {
n = read();
k = read(); f[n]=1;
for (int i = 1; i <= n; ++i) now[i] = read(), (fac *= i) %= mod;
prework();
if (cnt <= k)
return cout << cnt * fac % mod << endl, 0;
for (int i = n - 1; i > k; --i) f[i] = (n + (n - i) * f[i + 1] % mod) % mod * inv(i) % mod;
for (int i = cnt; i > k; --i) (ans += f[i]) %= mod;
cout << (ans+k) * fac % mod << endl;
return 0;
}
} // namespace yspm
signed main() { return yspm::main(); }

LGOJ3747 六省联考2017 分手是祝愿的更多相关文章

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

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

  2. bzoj千题计划266:bzoj4872: [六省联考2017]分手是祝愿

    http://www.lydsy.com/JudgeOnline/problem.php?id=4872 一种最优解是 从大到小灯有亮的就灭掉 最优解是唯一的,且关灯的顺序没有影响 最优解 对每个开关 ...

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

    4872: [Shoi2017]分手是祝愿 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 516  Solved: 342[Submit][Statu ...

  4. [BZOJ4872][六省联考2017]分手是祝愿

    BZOJ Luogu sol 首先发现肯定有解,又因为每个位置至多操作一次,所以最优解一定是在\([0,n]\)之间 有一种可以在\(O(\sum_{i=1}^{n}\lfloor\frac{n}{i ...

  5. luoguP3750 [六省联考2017]分手是祝愿 概率期望DP + 贪心

    ...........真的神状态了,没办法去想的状态................... 考试的时候选择$50$分贪心+$15$分状压吧,别的点就放弃算了........ 令$f[i]$表示从最小步 ...

  6. [六省联考2017]分手是祝愿 期望DP

    表示每次看见期望的题就很懵逼... 但是这题感觉还是值得一做,有可借鉴之处 要是下面这段文字格式不一样的话(虽然好像的确不一样,我也不知道为什么,是直接从代码里面复制出来的,因为我一般都是习惯在代码里 ...

  7. P3750 [六省联考2017]分手是祝愿 期望DP

    \(\color{#0066ff}{ 题目描述 }\) Zeit und Raum trennen dich und mich. 时空将你我分开. B 君在玩一个游戏,这个游戏由 \(n\) 个灯和 ...

  8. BZOJ4872 [六省联考2017]分手是祝愿 【期望dp】

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

  9. 洛谷P3750 [六省联考2017]分手是祝愿(期望dp)

    传送门 嗯……概率期望这东西太神了…… 先考虑一下最佳方案,肯定是从大到小亮的就灭(这个仔细想一想应该就能发现) 那么直接一遍枚举就能$O(nlogn)$把这个东西给搞出来 然后考虑期望dp,设$f[ ...

随机推荐

  1. Java singleton 单例

    饿汉式,instance在类加载化时完成初始化,线程安全 package cookie; public class SingletonAtOnce { private SingletonAtOnce( ...

  2. 吴裕雄--天生自然C++语言学习笔记:C++ 数据封装

    所有的 C++ 程序都有以下两个基本要素: 程序语句(代码):这是程序中执行动作的部分,它们被称为函数. 程序数据:数据是程序的信息,会受到程序函数的影响. 封装是面向对象编程中的把数据和操作数据的函 ...

  3. Mapper method 'com.xxxx.other.dao.MyDao.getNo attempted to return null from a method with a primitive return type (int)

    使用myBatis调用存储过程的返回值,提示错误信息: org.apache.ibatis.binding.BindingException: Mapper method 'com.xxxx.othe ...

  4. Egret Engine 2D - 遮罩

      矩形遮罩 shp.mask = new egret.Rectangle(20,20,30,50);   注意如果rec发生变化,需要重要将rec赋值给shp.mask 删除遮罩的方法 sprite ...

  5. # vim ~/.vimrc vim配色

    Ubuntu # vim ~/.vimrc        # /hom/zzx 下 set nomodeline                "(这个一定要写,目前有这个安全漏洞) set ...

  6. <老古董>1962年的线性支持向量机解法

    我们说“训练”支持向量机模型,其实就是确定"最大间隔超平面". 用数学语言来说就是确定一个最优的W.好比训练一个逻辑回归模型的目的是确定最优的W和b. 输入 X,为一个n维向量 输 ...

  7. python利用百度云接口实现车牌识别

    一个小需求---实现车牌识别. 目前有两个想法 调云在线的接口或者使用SDK做开发(配置环境和编译第三方库很麻烦,当然使用python可以避免这些问题) 自己实现车牌识别算法(复杂) ! 一开始准备使 ...

  8. 经验分享:Essay写作遇到困难请你这样做

    很多留学生在essay写作中可能会遇到很多困难,要么是essay写作内容出现问题,又或者是对于essay写作格式的不了解,导致自己无法顺利完成essay.今天小编就收集了几位留学生的写作经验分享,希望 ...

  9. linux文件编辑VI命令详解

    vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令.由于对Unix及Linux系统的任何版本,vi编辑器是完全相 ...

  10. java里mongodb复合查询

    Query query = new Query();Criteria criteria = Criteria.where("packetTitle").is(redPacketSt ...