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. python getopt模块使用方法

    python中 getopt 模块,是专门用来处理命令行参数的 getop标准格式: 函数getopt(args, shortopts, longopts = []) shortopts 是短参数   ...

  2. Android兼容性测试CTS Verifier-环境搭建、测试执行、结果分析

    CTS Verifier算是CTS的一部分,需要手动进行,主要用于测试那些自动测试系统无法测试的功能,比如相机.传感器等.由于硬件配置或其他原因,不同手机上部分测试项目被隐藏,也就是说CTS Veri ...

  3. SSAS——MDX基础

    一.基本概念 MDX:一种查询语言,从多维的数据集单元格中检索数据.支持两种不同的模式: 1.表达式语言:定义和操纵Analysis Services对象和数据以计算值 2.查询语言:从Analysi ...

  4. HDU 3473 Minimum Sum 划分树

    题意: 给出一个长度为\(n(1 \leq n \leq 10^5)\)的序列\(a\) 有若干次查询l r:找到一个\(x\)使得\(\sum \limits_{l \leq i \leq r} \ ...

  5. HDU 5614 Baby Ming and Matrix tree 树链剖分

    题意: 给出一棵树,每个顶点上有个\(2 \times 2\)的矩阵,矩阵有两种操作: 顺时针旋转90°,花费是2 将一种矩阵替换为另一种矩阵,花费是10 树上有一种操作,将一条路经上的所有矩阵都变为 ...

  6. 小米手机安装 charles 证书,提示“没有可安装的证书”

    错误环境: 1. Mac 下的 charles 2. 小米手机(MI 6 MUI 9.6 ,Android 8.x) 错误提示: 安装 charles 证书时,提示“没有可安装的证书” 解决方法: 1 ...

  7. webdriver高级应用- 无人工干预地自动上传附件

    方法一:使用webdriver的send_keys方法上传文件,代码如下: #encoding=utf-8 from selenium import webdriver import unittest ...

  8. 为什么在header 和 session 之前不能有输出

    1.在header输出之前有输出内容的话,就会造成对header的错误理解(尽管现在已经能容错了),例如不是满足“keyword: value\n”的格式还好,直接错误了,但是满足“keyword: ...

  9. 用Navicat Premium同步表和数据

    1.选择工具 2.选择数据库 3.下一步选择表 注意:同步表的时候是先删除存在的表再创建表同步数据 SQL Server数据库转换MySQL数据库 https://blog.csdn.net/zhan ...

  10. 在SAE搭建微信公众账号服务

    让我们回到2014年11月,从公司请假回成都,在天府软件园B区旁边的小区里,那个10多平米的出租屋里,闲来无事,我想找个事情做一做,好让我这漂浮的心静下来.大约在半年前就申请了微信的一个公众账号,一直 ...