4872: [Shoi2017]分手是祝愿

Time Limit: 20 Sec  Memory Limit: 512 MB
Submit: 458  Solved: 299
[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

 
首先一个状态最少需要多少步是可以 O(N log N)算出来的,调和级数一下就好了。
而且我们可以发现,对于每一个状态,用最小步数关掉所有灯的方案是唯一的,考虑从后向前扫描,是1就动否则不动,总是最优的。
然后我们就设 f[i] 为关掉所有灯的最小步数为i的期望答案。
显然 当i<=k的时候,f[i]=i;其他情况,f[i] = (i/n) * f[i-1] + ((n-i)/n) * f[i+1] 。
为什么随机的式子是长那个样子的呢?
前面已经证明了对于每一个状态,最小步数关掉所有灯的方案是唯一的。
而又因为按灯的顺序不影响答案,所以有(i/n)的几率最短步数减少;
但如果没有按最短路上的灯,首先最短步数不会减少,因为最短路唯一;
而且也不会不变,因为如果还按原来的套路按灯的话最后不会都灭;
那么按了不是最短方案的灯,会让最短步数增加多少呢?
只能是1,因为可以再按一步回去。
 
我们可以发现的是,f[n] = f[n-1] + 1。
通过这个向前推,可以推出形如f[i] = f[i-1] + h[i]的式子,并且h[i] = (n / i) (1 + h[i+1] * (n-i) / n) 。
 
然后就可以直接从前往后递推了,对于i<=k,f[i] = i;否则, f[i] = f[i-1] + h[i] 。
然后就可以A了2333
 
#include<bits/stdc++.h>
#define ll long long
#define maxn 100005
#define ha 100003
using namespace std;
int n,k,T,a[maxn],opt[maxn];
int f[maxn],jc=1,inv[maxn],h[maxn]; inline int add(int x,int y){
x+=y;
return x>=ha?x-ha:x;
} inline void init(){
inv[1]=1;
for(int i=2;i<ha;i++) inv[i]=-inv[ha%i]*(ll)(ha/i)%ha+ha;
} int main(){
init(); scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++) scanf("%d",a+i),jc=jc*(ll)i%ha;
for(int i=n;i;i--){
for(int j=i<<1;j<=n;j+=i) a[i]^=opt[j];
if(a[i]) opt[i]=1,T++;
} f[0]=0;
for(int i=1;i<=k;i++) f[i]=i;
h[n]=1;
for(int i=n-1;i;i--) h[i]=add(n*(ll)inv[i]%ha,h[i+1]*(ll)(n-i)%ha*(ll)inv[i]%ha);
for(int i=k+1;i<=T;i++) f[i]=add(f[i-1],h[i]); printf("%d\n",f[T]*(ll)jc%ha);
return 0;
}

  

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

  1. 2017 [六省联考] T2 相逢是问候

    4869: [Shoi2017]相逢是问候 Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 1205  Solved: 409[Submit][Stat ...

  2. 2017 [六省联考] T1 期末考试

    4868: [Shoi2017]期末考试 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 842  Solved: 385[Submit][Status ...

  3. 2017 [六省联考] T6 寿司餐厅

    4873: [Shoi2017]寿司餐厅 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 450  Solved: 316[Submit][Status ...

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

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

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

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

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

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

  7. 【BZOJ4873】[六省联考2017]寿司餐厅(网络流)

    [BZOJ4873][六省联考2017]寿司餐厅(网络流) 题面 BZOJ 洛谷 题解 很有意思的题目 首先看到答案的计算方法,就很明显的感觉到是一个最大权闭合子图. 然后只需要考虑怎么构图就行了. ...

  8. 【BZOJ4868】[六省联考2017]期末考试(贪心)

    [BZOJ4868][六省联考2017]期末考试(贪心) 题面 BZOJ 洛谷 题解 显然最终的答案之和最后一个公布成绩的课程相关. 枚举最后一天的日期,那么维护一下前面有多少天可以向后移,后面总共需 ...

  9. 六省联考2017 Day1

    目录 2018.3.18 Test T1 BZOJ.4868.[六省联考2017]期末考试 T2 T3 BZOJ.4870.[六省联考2017]组合数问题(DP 矩阵快速幂) 总结 考试代码 T1 T ...

随机推荐

  1. 面试题--如何防止sql注入,使用PreparedStatement的预编译,传入的内容就不会和原来的语句发生任何匹配的关系,达到防止注入的方法

    PreparedStatement的用法 jdbc(java database connectivity,java数据库连接)的api中的主要的四个类之一的java.sql.statement要求开发 ...

  2. nrf52裸机学习——GPIO操作

    /** * @brief Function for writing a value to a GPIO pin. * * Note that the pin must be configured as ...

  3. cf 1006E

    #include <iostream> #include <cstdio> #include <cstring> #include <string> # ...

  4. winServer08上安装SQL时提示“必须使用管理角色安装”或配置microsoft.net framework 3.5

    server 2008安装vs2008后报错,如图: 解决方法: 控制面板—>程序—>打开或关闭Windows功能—>进入服务器管理器选择功能—>添加功能 然后勾选.NET F ...

  5. adb提取安装的apk

    第一步:列出所有安装的apk adb shell pm list packages  然后找到自己要取出来的apk的包名. 第二布:找到apk的位置(后面跟上包名) adb shell pm path ...

  6. studio rendering problems

    问题--------> Rendering Problems The following classes could not be instantiated: - android.support ...

  7. Leetcode 417.太平洋大西洋水流问题

    太平洋大西洋水流问题 给定一个 m x n 的非负整数矩阵来表示一片大陆上各个单元格的高度."太平洋"处于大陆的左边界和上边界,而"大西洋"处于大陆的右边界和下 ...

  8. PDO 使用prepared statement 预处理LIMIT等非表字段参数

    由于一些驱动不支持原生的预处理语句,因此PDO可以完全模拟预处理.PDO的模拟预处理是默认打开的,即便MYSQL驱动本身支持预处理,在默认打开的状态下,PDO是不会用到MYSQL本身提供的预处理功能. ...

  9. Bind Enum To DropDownList ?

    0. 准备测试数据 0.1 : 枚举 using System; using System.Collections.Generic; using System.Linq; using System.W ...

  10. spring分布式事务控制

    应用场景问题描述解决方法多数据源配置单元测试第一种方法:最大努力一次提交模式第二种方法:最大努力一次提交模式 但使用ChainedTransactionManagerChainedTransactio ...