题面

Bzoj

Sol

首先从大向小,能关就关显然是最优

然后

设\(f[i]\)表示剩下最优要按i个开关的期望步数,倒推过来就是

\[f[i]=f[i-1]*i*inv[n]+f[i+1]*(n-i)*inv[n]+1
\]

\(inv\)表示逆元

设\(g[i]=f[i]-f[i-1]\)

那么上式变为

\[\sum_{j=1}^{i}g[i]=\sum_{j=1}^{i-1}g[i] *i*inv[n]+\sum_{j=1}^{i+1}g[i]*(n-i)*inv[n]+1
\]

化简

\[g[i]=(g[i]+g[i+1])*(n-i)*inv[n]+1\\
g[i]=((n-i)*g[i+1]+n)*inv[i]\\
\]

边界\(g[n+1]=0\)

最后就记个前缀和就好了

# include <bits/stdc++.h>
# define RG register
# define IL inline
# define Fill(a, b) memset(a, b, sizeof(a))
using namespace std;
typedef long long ll;
const int _(1e5 + 5);
const int Zsy(100003); IL ll Input(){
RG ll x = 0, z = 1; RG char c = getchar();
for(; c < '0' || c > '9'; c = getchar()) z = c == '-' ? -1 : 1;
for(; c >= '0' && c <= '9'; c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);
return x * z;
} int n, k, step, facn = 1, inv[_], f[_], ans;
bool sta[_], nxt[_]; IL void Up(RG int &x, RG int y){
x += y;
if(x >= Zsy) x -= Zsy;
} int main(RG int argc, RG char* argv[]){
n = Input(); k = Input();
for(RG int i = 1; i <= n; ++i) facn = 1LL * facn * i % Zsy, sta[i] = Input();
for(RG int i = n; i; --i){
RG bool g = sta[i];
for(RG int j = i + i; j <= n; j += i) g ^= nxt[j];
if(g) nxt[i] = 1, ++step;
}
if(step <= k) return printf("%lld\n", 1LL * facn * step % Zsy), 0;
inv[1] = 1;
for(RG int i = 2; i <= n; ++i) inv[i] = (-1LL * (Zsy / i) * inv[Zsy % i] % Zsy + Zsy) % Zsy;
for(RG int i = 1; i <= k; ++i) f[i] = 1;
for(RG int i = n; i > k; --i) f[i] = 1LL * inv[i] * (1LL * (n - i) * f[i + 1] % Zsy + n) % Zsy;
for(RG int i = 1; i <= step; ++i) Up(ans, f[i]);
printf("%lld\n", 1LL * facn * ans % Zsy);
return 0;
}

Bzoj4872: [Shoi2017]分手是祝愿的更多相关文章

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

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

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

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

  3. 【BZOJ4872】[Shoi2017]分手是祝愿 数学+期望DP

    [BZOJ4872][Shoi2017]分手是祝愿 Description Zeit und Raum trennen dich und mich. 时空将你我分开.B 君在玩一个游戏,这个游戏由 n ...

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

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

  5. 【BZOJ4872】分手是祝愿(动态规划,数学期望)

    [BZOJ4872]分手是祝愿(动态规划,数学期望) 题面 BZOJ 题解 对于一个状态,如何求解当前的最短步数? 从大到小枚举,每次把最大的没有关掉的灯关掉 暴力枚举因数关就好 假设我们知道了当前至 ...

  6. BZOJ_4872_[Shoi2017]分手是祝愿_概率与期望

    BZOJ_4872_[Shoi2017]分手是祝愿_概率与期望 Description Zeit und Raum trennen dich und mich. 时空将你我分开.B 君在玩一个游戏,这 ...

  7. 【BZOJ4872】分手是祝愿

    分手是祝愿 [题目大意] 有n 个灯,每个灯有两个状态亮和灭,我们用 1 来表示这个灯是亮的,用 0 表示这个灯是灭的,操作第 i 个开关时,所有编号为 i 的约数(包括 1 和 i)的灯的状态都会被 ...

  8. SHOI2017 分手是祝愿

    分手是祝愿 有

  9. BZOJ4872:[SHOI2017]分手是祝愿——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=4872 https://www.luogu.org/problemnew/show/P3750 Zei ...

随机推荐

  1. Java中从键盘输入的三种方法

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import ...

  2. linux磁盘及分区详解

    1.Linux 分区简介 1.1 主分区 vs 扩展分区 硬盘分区表中最多能存储四个分区,但我们实际使用时一般只分为两个分区,一个是主分区(Primary Partion)一个是扩展分区(extend ...

  3. Java导出freemarker的三种方法

    在上一篇呢,我将导出word文档的想法与思路以及实现功能的代码分享了一下,在这里, 我想说的是我对导出freemarker模板路径的三种方法的理解和认知.  有错误的话希望大家帮忙指正 在接下来我会使 ...

  4. shiro进行散列算法操作

    shiro最闪亮的四大特征:认证,权限,加密,会话管理 为了提高应用系统的安全性,这里主要关注shiro提供的密码服务模块: 1.加密工具类的熟悉 首先来个结构图,看看shiro提供了哪些加密工具类: ...

  5. 用原生js实现一个new方法

    首先写一个父类方法(包含参数name,age): function Person(name,age){ this.name = name; this.age = age; } new一个Person的 ...

  6. 理解Activity.runOnUiThread()

    这是一篇译文(中英对照),原文链接:Understanding Activity.runOnUiThread() When developing Android applications we alw ...

  7. es6之let和const命令的一些笔记

    let和const命令 let命令 基本用法 let命令用来声明变量,声明的变量只在命令所在的代码块内有效.for循环中很适合使用let命令. 有必要理解的例子: var a = []; for (v ...

  8. HDU - 1241 dfs or bfs [kuangbin带你飞]专题一

    8个方向求联通块,经典问题. AC代码 #include<cstdio> #include<cstring> #include<algorithm> #includ ...

  9. mongodb Decimal Spring data mongodb Decimal128 SpringMvc 序列化字符串 json converter

    Mongodb 3.4 就开始支持Decimal 类型,解决double的精度问题,但是不太好用,MapReduce的时候Array.sum 也不能计算 Decimal.比较坑,但是聚合可以用 Spr ...

  10. Redis--配置密码

    可以通过以下方法进行密码的配置: ① 修改配置文件设置密码 ② 通过命令修改密码(重启redis后,新设置的密码会失效) 此处介绍第一种 1. 找到redis的配置文件,一般在/etc/redis.c ...