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 \leq n \leq 100000, 0 \leq k \leq n\);

Output

输出一行,为操作次数的期望乘以 \(n\) 的阶乘对 100003 取模之后的结果。

Sample Input

4 0

0 0 1 1

Sample Output

512


想法

又是个小文艺题,原谅我有点激动。。。

首先从 \(n\) 到 \(1\) 扫一遍,哪些灯需要被按1次是可以知道的,而且必须按这些灯。

如果不小心按了其他的灯,就必须再按一次变回来。

神奇的 \(dp\) 方式,设 \(f[i]\) 表示从最少需要按 \(i\) 次的状态变到最少需要按 \(i-1\) 次的状态的期望步数。

随机按一次,按中 \(i\) 个需要按的键之一的概率是 \(\frac{i}{n}\) ,按后变到了至少按 \(i-1\) 次的状态,步数为1

若没有按中需要的键,概率是 \(\frac{n-i}{n}\) , 此时至少需要按 \(i+1\) 个键,应再按 \(f[i+1]\) 次恢复至少按 \(i\) 次的状态,再按 \(f[i]\) 次到至少 \(i-1\) 次的状态,总共步数为 \(1+f[i+1]+f[i]\)

综上所述,可列出式子

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

合并同类项,整理一下得出

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

边界条件 \(f[n]=1\)

从 \(n\) 往前求 \(f[]\) ,一直求到 \(f[k+1]\)

扫一遍得出原状态至少按的次数 \(t\)

若 \(t \leq k\) ,则总期望值就是 \(t\) ; 否则是 \(k+\sum\limits_{i=k+1}^t f[i]\)

最后别忘了乘以 \(n\) 的阶乘!


代码

#include<cstdio>
#include<iostream>
#include<algorithm> #define xzy 100003 using namespace std; const int N = 100005;
typedef long long ll; int n,k,t;
int a[N]; int Pow_mod(int x,int y){
int ret=1;
while(y){
if(y&1) ret=((ll)ret*x)%xzy;
x=((ll)x*x)%xzy;
y>>=1;
}
return ret;
}
int f[N],inv[N]; int main()
{
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++) scanf("%d",&a[i]); t=0;
for(int i=n;i>0;i--){
if(!a[i]) continue;
t++;
for(int j=1;j*j<=i;j++)
if(i%j==0){
a[j]^=1;
if(j*j!=i) a[i/j]^=1;
}
} inv[1]=1;
for(int i=2;i<=n;i++) inv[i]=xzy-1ll*(xzy/i)*inv[xzy%i]%xzy; int ans=k;
f[n]=1;
for(int i=n-1;i>k;i--)
f[i]=(1ll*(n-i)*f[i+1]%xzy+n)%xzy*inv[i]%xzy; if(t<=k) ans=t;
else for(int i=k+1;i<=t;i++) ans=(ans+f[i])%xzy;
for(int i=2;i<=n;i++) ans=((ll)ans*i)%xzy;
printf("%d\n",ans); return 0;
}

[bzoj4872] [洛谷P3750] [六省联考2017] 分手是祝愿的更多相关文章

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

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

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

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

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

    题面传送门 首先我们需注意到这样一个性质:那就是对于任何一种状态,将其变为全 \(0\) 所用的最小步数的方案是唯一的--考虑编号为 \(n\) 的灯,显然如果它原本是暗着的就不用管它了,如果它是亮着 ...

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

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

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

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

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

    luogu loj 可以发现在最优策略中,每种操作最多只会做一次,并且操作的先后顺序并不会影响答案,所以考虑从后往前扫,碰到一个\(1\)就对这个位置\(i\)进行操作,这样的操作一定是最优策略.记最 ...

  7. 洛谷 P3747 [六省联考2017]相逢是问候 解题报告

    P3747 [六省联考2017]相逢是问候 题目描述 \(\text {Informatik verbindet dich und mich.}\) 信息将你我连结. \(B\) 君希望以维护一个长度 ...

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

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

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

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

随机推荐

  1. CF1045G AI robots

    CF1045G AI robots 题目大意就不说了 这道题可以用CDQ分治做 但是,如何选择CDQ分治的维度一直是CDQ分治的难点所在 这道题我们有三种选择 1.让智商高的数智商低的 2.让看的近的 ...

  2. react-electron 项目打包体积尽可能减小的方法

    当一个react-electron项目做好之后就可以开始进行打包,首先就是打包react,这个自然不用多说,不过事先要记住一点,项目目录主进程文件main.js最好放在根目录,再执行打包命令 npm ...

  3. 【python安装】错误——“User installations are disabled via policy on the machine”

    报错界面: 解决方法一:  1.在运行里输入gpedit.msc;  2.计算机配置管理>>管理模板>>windows组件>>windows Installer&g ...

  4. 解决Coursera视频无法观看的三种方法(亲测有效)

      ​   最近在coursera上课时出现了视频黑屏,网页缓冲,无法观看等问题,经过查询发现很多人也有同样的问题.对于不同的原因,一般来说解决方法也不同.这里有三种办法,大家可以挨个尝试,肯定有一个 ...

  5. 公子奇带你一步一步了解Java8中Lambda表达式

    在上一篇<公子奇带你一步一步了解Java8中行为参数化>中,我们演示到最后将匿名实现简写为 (Police police) -> "浙江".equals(poli ...

  6. 你的IDEA过期了?跃哥四大招帮你稳住

    作者:Dimple Solgan:当你的才华还无法撑起你的野心时候,那应该静下心来好好学习 前天晚上在群里风风火火组建了两个学习小组,一个是面向Java初学,一个是面向Python初学,把我搞的兴奋不 ...

  7. Linux学习之路--常用命令

    #ls  显示文件信息 #ll  显示文件(不包括隐藏文件)具体信息 等于 #ls -l #ll -a 显示所有文件(包括隐藏文件)具体信息 #ll -htr aa  显示最近修改的文件 h是易读的 ...

  8. 洛谷训练新手村之“BOSS战-入门综合练习2”题解

    P1426 小鱼会有危险吗 题目链接:https://www.luogu.com.cn/problem/P1426 题目大意: 有一次,小鱼要从A处沿直线往右边游,小鱼第一秒可以游7米,从第二秒开始每 ...

  9. docker命令总结(二)

    上次只是给大家把命令的作用以及简单使用列出来了(大家可以查看:docker命令总结(一)),那这篇文章会详细介绍每条命令的参数,命令比较多建议大家使用搜索,进行查看 search docker sea ...

  10. Vue.js 入门 --- vue.js 安装

    本博文转载  https://blog.csdn.net/m0_37479246/article/details/78836686 Vue.js(读音 /vjuː/, 类似于 view)是一个构建数据 ...