4872: [Shoi2017]分手是祝愿

Time Limit: 20 Sec  Memory Limit: 512 MB
[Submit][Status][Discuss]

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

HINT

 

Source

黑吉辽沪冀晋六省联考

直接概率dp懒得写式子了

应该很久以前就做过这题但是一直没有在BZOJ交

 #include<bits/stdc++.h>

 using namespace std;

 const int MAXN = ;
const int INF = ;
long long n, k;
long long f[MAXN], ans;
long long dp[MAXN]; template <typename tn> void read (tn & a) {
tn x = , f = ;
char c = getchar();
while ( c < '' || c > '' ) { if (c == '-') f = -; c = getchar(); }
while ( c >= '' && c <= '' ) { x = x * + c - ''; c = getchar(); }
a = f == ? x : -x;
} long long inv (long long x) {
if (x == ) return ;
return - ( inv(INF % x) * (INF / x) ) % INF;
} int main() {
read(n);
read(k);
dp[n] = ;
for (int i = n - ; i > k; --i) {
dp[i] = + (n - i) * (dp[i + ] + ) * inv(i);
dp[i] %= INF;
}
ans = ;
for (int i = ; i <= n; ++i) read(f[i]);
for (int i = n; i >= ; --i) {
if (f[i]) {
++ans;
for (int j = ; j * j <= i; ++j) {
if (i % j == ) {
if (j * j == i) { f[j] = - f[j]; continue; }
f[j] = - f[j];
f[i / j] = - f[i / j];
}
}
}
}
long long an = min(ans, k);
for (int i = ans; i > k; --i) {
an += dp[i];
an %= INF;
}
for (int i = ; i <= n; ++i) {
an *= i;
an %= INF;
}
while (an < ) an += INF;
an %= INF;
cout << an << "\n";
return ;
}

最新文章

  1. jQuery基础课程
  2. 怎么用JS截取字符串中第一个和第二个字母间的部分?
  3. [C:\Users\Administrator\.IntelliJIdea2016.1\system\tomcat\Unnamed_demo_2\work\Catalina\localhost\demo\org\apache\jsp\index_jsp.java]
  4. UVa 11039 (排序+贪心) Building designing
  5. 安卓 Dialogs(对话框)
  6. 通过源码学Java基础:InputStream、OutputStream、FileInputStream和FileOutputStream
  7. FileZilla 425 Can&#39;t open data connection
  8. android四大组件详解--摘
  9. 【算法系列学习】状压dp [kuangbin带你飞]专题十二 基础DP1 D - Doing Homework
  10. SPATRA的使用
  11. flex布局下overflow失效问题
  12. java集合框架(1) hashMap 简单使用以及深度分析(转)
  13. Hibernate学习(一)———— 第一个hibernate工程
  14. Ansible系列(四):playbook应用和roles自动化批量安装示例
  15. Codeforces Round #516 (Div. 2, by Moscow Team Olympiad) D. Labyrinth
  16. poj 3264 区间最大最小值 RMQ问题之Sparse_Table算法
  17. C# SQLite数据库操作
  18. 古典、SOA、传统、K8S、ServiceMesh
  19. script 执行的三种方式
  20. 【Python】Python处理csv文件

热门文章

  1. 防止asp马后门
  2. 为什么企业需要IT资产管理
  3. MySQL-8.0.15在Win10和Ubuntu上安装&amp;使用
  4. 马凯军201771010116《面向对象程序设计(java)》第六周学习总结
  5. 入门项目 A5-1 interface-bank 第三方接口1
  6. 将100道计算题输出至txt文件,再读取文件至控制台,在控制台中输入答案并评判对错
  7. yarn不是内部指令 react-native不是内部指令
  8. Python2和Python3安装注意事项
  9. SQLI DUMB SERIES-7
  10. PTA——洗牌