4872: [Shoi2017]分手是祝愿

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


50% n=k 送分...从大到小选就行了...实际上送了80分...

这个期望DP没想到不应该啊

\(f[i]\)表示还有i步可以结束的期望步数

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

但是k=0就gg了

考虑差分f,或者说\(g[i]\)表示i到i-1步的期望步数

\[g[i] = \frac{i}{n} + \frac{n-i}{n}(g[i+1] + g[i] + 1),\ g[n] = 1,\ g[i \le k]=1
\]

答案就是\(g[最优策略步数]\)啰

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int N = 1e5+5, P = 100003, mo = P;
inline int read() {
char c=getchar(); int x=0,f=1;
while(c<'0' || c>'9') {if(c=='-')f=-1; c=getchar();}
while(c>='0' && c<='9') {x=x*10+c-'0'; c=getchar();}
return x*f;
} int n, k, a[N];
int mark[N];
ll inv[N], g[N], fac = 1;
void solve() {
int t = 0;
for(int i=n; i>=1; i--) {
int p = a[i];
for(int j=i+i; j<=n; j+=i) if(mark[j]) p ^= 1;
if(p) mark[i] = 1, t++;
}
if(t <= k) {printf("%lld", t * fac %mo); return;} inv[1] = 1;
for(int i=2; i<=n; i++) inv[i] = (P - P/i) * inv[P%i] %P;
for(int i=1; i<=k; i++) g[i] = 1;
g[n] = 1;
for(int i=n-1; i>k; i--) g[i] = ((n-i) * g[i+1] %mo + n) * inv[i] %mo;
ll ans = 0;
for(int i=1; i<=t; i++) ans += g[i];
printf("%lld", ans * fac %mo);
} int main() {
freopen("in", "r", stdin);
n=read(); k=read();
for(int i=1; i<=n; i++) a[i] = read(), fac = fac * i %mo;
solve();
}

bzoj 4872: [Shoi2017]分手是祝愿 [期望DP]的更多相关文章

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

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

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

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

  3. bzoj 4872: [Shoi2017]分手是祝愿

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

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

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

  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

    题目大意 有\(n\)盏灯和\(n\)个开关,初始时有的灯是亮的,有的灯是暗的.按下第\(i\)个开关会使第\(j\)盏灯的状态被改变,其中\(j|i\).每次你会随机操作一个开关,直到可以通过不多于 ...

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

    表示每次看见期望的题就很懵逼... 但是这题感觉还是值得一做,有可借鉴之处 要是下面这段文字格式不一样的话(虽然好像的确不一样,我也不知道为什么,是直接从代码里面复制出来的,因为我一般都是习惯在代码里 ...

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

    原题戳这里 首先可以确定的是最优策略一定是从大到小开始,遇到亮的就关掉,因此我们可以\(O(nlogn)\)的预处理出初始局面需要的最小操作次数\(tot\). 然后容(hen)易(nan)发现即使加 ...

随机推荐

  1. Video Target Tracking Based on Online Learning—TLD多目标跟踪算法

    TLD算法回顾 TLD(Tracking-Learning-Detection)是英国萨里大学的一个捷克籍博士生Zdenek Kalal在其攻读博士学位期间提出的一种新的单目标长时间(long ter ...

  2. c++extern关键字详解

    1 基本解释 :extern可以置于变量或者函数 前,以标示变量或者函数的定义在别的文件中 ,提示编译器遇到此变量和函数时在其他模块中寻找其定义 .此外extern也可用来进行链接指定. 也就是说ex ...

  3. Spark环境搭建(上)——基础环境搭建

    Spark摘说 Spark的环境搭建涉及三个部分,一是linux系统基础环境搭建,二是Hadoop集群安装,三是Spark集群安装.在这里,主要介绍Spark在Centos系统上的准备工作--linu ...

  4. angularJS 与angujs-sku实现购物车组合查询

    原网址:http://sentsin.com/web/1069.html   demo : https://codepen.io/hzxs1990225/pen/VYyOdW  修复版文件下载:htt ...

  5. Angular 选项卡

    <div ng-init="now=0;" class="nav"> <h4>选项卡</h4> <div > & ...

  6. Effective Java 第三版——26. 不要使用原始类型

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  7. uwsgi常用配置

    一.安装方式 1.wget 可以去官网:https://pypi.python.org/pypi/uWSGI/ 下载对应的版本   tar -xvf uwsgi-2.13.1.tar.gz cd uw ...

  8. shopnc IM配置过程

    im配置windows下,修改chat下和data下的config,安装node,覆盖node下文件即可

  9. Intel系列微处理器的三种工作模式

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

  10. 2017-06-27(useradd usermod userdel 禁止普通用户登录)

    useradd useradd  -g  组名  用户名  (添加新用户,并将其添加到指定的主用户组) useradd  -g  组名  -G 附属组名  用户名  (添加新用户,并将其添加至指定主用 ...