题目大意

  有\(n\)盏灯和\(n\)个开关,初始时有的灯是亮的,有的灯是暗的。按下第\(i\)个开关会使第\(j\)盏灯的状态被改变,其中\(j|i\)。每次你会随机操作一个开关,直到可以通过不多于\(k\)次操作使所有灯都灭掉,然后按照操作次数最小的方案操作。求期望的操作次数\(\times n!~mod~100003\)。

  \(1\leq n\leq 100000,0\leq k\leq n\)

题解

  首先不能通过操作任意个不同的开关使得灯的状态不变,因为最大那个开关对应的灯的状态一定会改变。

  所以我们每次操作亮着的灯中编号最大的那盏对应的开关,直到所有灯都灭掉。这个操作步骤一定是最优步骤。记下操作次数\(num\)。

  设\(f_i\)为\(i\)盏灯变成\(i-1\)盏灯期望操作次数,有:

\[\begin{align}
f_i&=\frac{i}{n}+\frac{n-i}{n}(1+f_{i+1}+f_i)\\
\frac{i}{n}f_i&=1+\frac{n-i}{n}f_{i+1}\\
f_i&=\frac{n+(n-i)f_{i+1}}{i}
\end{align}
\]

  特殊的,\(f_{n+1}=0\)

  最后把答案乘上\(n!\)

  时间复杂度:\(O(n\sqrt n)\)

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<ctime>
#include<utility>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
ll p=100003;
ll fp(ll a,ll b)
{
ll s=1;
while(b)
{
if(b&1)
s=s*a%p;
a=a*a%p;
b>>=1;
}
return s;
}
int a[100010];
ll f[100010];
int main()
{
int n,k;
scanf("%d%d",&n,&k);
int i,j;
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
int num=0;
for(i=n;i>=1;i--)
if(a[i])
{
num++;
for(j=1;j*j<=i;j++)
if(i%j==0)
{
a[j]^=1;
if(j*j!=i)
a[i/j]^=1;
}
}
ll s=1;
f[n+1]=1;
for(i=n;i>=1;i--)
f[i]=(n+(n-i)*f[i+1]%p)%p*fp(i,p-2)%p;
if(num<=k)
s=num;
else
{
s=0;
for(i=num;i>k;i--)
s=(s+f[i])%p;
s=(s+k)%p;
}
for(i=1;i<=n;i++)
s=s*i%p;
printf("%lld\n",s);
return 0;
}

【BZOJ4872】【SHOI2017】分手是祝愿 期望DP的更多相关文章

  1. bzoj 4872: [Shoi2017]分手是祝愿 [期望DP]

    4872: [Shoi2017]分手是祝愿 题意:n个灯开关游戏,按i后i的约数都改变状态.随机选择一个灯,如果当前最优策略\(\le k\)直接用最优策略.问期望步数\(\cdot n! \mod ...

  2. 【BZOJ】4872: [Shoi2017]分手是祝愿 期望DP

    [题意]给定n盏灯的01状态,操作第 i 盏灯会将所有编号为 i 的约数的灯取反.每次随机操作一盏灯直至当前状态能够在k步内全灭为止(然后直接灭),求期望步数.n,k<=10^5. [算法]期望 ...

  3. 【bzoj4872】[Shoi2017]分手是祝愿 期望dp

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

  4. BZOJ 4827 [Shoi2017]分手是祝愿 ——期望DP

    显然,考虑当前状态最少需要几步,直接贪心即可. 显然我们只需要考虑消掉这几个就好了. 然后发现,关系式找出来很简单,是$f(i) f(i+1) f(i-1)$之间的. 但是计算的时候并不好算. 所以把 ...

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

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

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

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

  7. BZOJ4872: [Shoi2017]分手是祝愿【概率期望DP】【思维好题】

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

  8. 2018.11.01 bzoj4872: [Shoi2017]分手是祝愿(期望dp)

    传送门 一道不错的题. 考虑n==kn==kn==k的时候怎么做. 显然应该从nnn到111如果灯是开着的就把它关掉这样是最优的. 不然如果乱关的话会互相影响肯定不如这种优. 于是就可以定义状态f[i ...

  9. Bzoj4872: [Shoi2017]分手是祝愿

    题面 Bzoj Sol 首先从大向小,能关就关显然是最优 然后 设\(f[i]\)表示剩下最优要按i个开关的期望步数,倒推过来就是 \[ f[i]=f[i-1]*i*inv[n]+f[i+1]*(n- ...

随机推荐

  1. H5 颜色属性

    07-颜色属性 我是段落 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...

  2. UVA -580 组合数学

    #include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> ...

  3. Diverse Garland CodeForces - 1108D (贪心+暴力枚举)

    You have a garland consisting of nn lamps. Each lamp is colored red, green or blue. The color of the ...

  4. vue学习笔记总结----思维导图

  5. Django的模板语言

      Django模板系统 官方文档 常用语法 只需要记两种特殊符号: {{  }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 变量 {{ 变量名 }} 变量名由字母数字和下划线组成. ...

  6. centos/ubuntu 双击运行 .sh(shell)文件

    centos 创建桌面双击启动程序(更改图标) - Feythin Lau - 博客园http://www.cnblogs.com/feiyuliu/archive/2012/11/29/279503 ...

  7. tomcat server.xml各个端口的作用

    <Server port="8005" shutdown="SHUTDOWN"> <!-- port:指定一个端口,这个端口负责监听关闭Tom ...

  8. Effective C++目录

    条款1:视C++为一个语言联邦 条款2:尽量以const.enum.inline替换#define 条款3:尽可能使用const 条款4:确定对象使用前已先被初始化 条款5:了解C++默认编写并调用哪 ...

  9. 查看端口占用cmd命令

    查看端口被占用的进程: 在任务管理器中结束进程:

  10. spring AOP源码分析(二)

    现在,我们将对代理对象的生成过程进行分析. 在springAOP源码分析(一)的例子中,将会生成哪些对象呢? 可以看到将会生成六个对象,对应的beanName分别是: userDao:目标对象 log ...