2018.11.01 bzoj4872: [Shoi2017]分手是祝愿(期望dp)
传送门
一道不错的题。
考虑n==kn==kn==k的时候怎么做。
显然应该从nnn到111如果灯是开着的就把它关掉这样是最优的。
不然如果乱关的话会互相影响肯定不如这种优。
于是就可以定义状态f[i]f[i]f[i]表示从当前按iii盏为最优方案转移到按i−1i-1i−1盏为最优方案的代价。
然后f[i]=in+n−in∗(1+f[i]+f[i+1])f[i]=\frac i n+\frac {n-i} n*(1+f[i]+f[i+1])f[i]=ni+nn−i∗(1+f[i]+f[i+1])
移项解方程可以推出最后的式子:
f[i]=in∗(n+(n−i)∗f[i+1])f[i]=\frac i n*(n+(n-i)*f[i+1])f[i]=ni∗(n+(n−i)∗f[i+1])
代码:
#include<bits/stdc++.h>
using namespace std;
inline int read(){
int ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans;
}
typedef long long ll;
const int N=1e5+5,mod=1e5+3;
int n,k,inv[N],a[N],f[N],ans=0,cnt=0;
int main(){
n=read(),k=read();
for(int i=1;i<=n;++i)a[i]=read();
for(int i=n;i;--i)if(a[i]){
++cnt;
for(int j=1;j*j<=i;++j){
if(i!=i/j*j)continue;
a[j]^=1,a[i/j]^=(i/j!=j);
}
}
if(cnt<=k){
for(int i=2;i<=n;++i)cnt=(ll)cnt*i%mod;
cout<<cnt;
return 0;
}
inv[1]=1;
for(int i=2;i<=n;++i)inv[i]=(ll)inv[mod%i]*(mod-mod/i)%mod;
f[n]=1;
for(int i=n-1;i>k;--i)f[i]=(ll)inv[i]*((((ll)n+(ll)(n-i)*f[i+1]%mod))%mod)%mod;
for(int i=cnt;i>k;--i){
ans+=f[i];
if(ans>=mod)ans-=mod;
}
ans+=k;
if(ans>=mod)ans-=mod;
for(int i=2;i<=n;++i)ans=(ll)ans*i%mod;
cout<<ans;
return 0;
}
2018.11.01 bzoj4872: [Shoi2017]分手是祝愿(期望dp)的更多相关文章
- bzoj 4872: [Shoi2017]分手是祝愿 [期望DP]
4872: [Shoi2017]分手是祝愿 题意:n个灯开关游戏,按i后i的约数都改变状态.随机选择一个灯,如果当前最优策略\(\le k\)直接用最优策略.问期望步数\(\cdot n! \mod ...
- 【BZOJ】4872: [Shoi2017]分手是祝愿 期望DP
[题意]给定n盏灯的01状态,操作第 i 盏灯会将所有编号为 i 的约数的灯取反.每次随机操作一盏灯直至当前状态能够在k步内全灭为止(然后直接灭),求期望步数.n,k<=10^5. [算法]期望 ...
- 【bzoj4872】[Shoi2017]分手是祝愿 期望dp
Description Zeit und Raum trennen dich und mich. 时空将你我分开.B 君在玩一个游戏,这个游戏由 n 个灯和 n 个开关组成,给定这 n 个灯的初始状态 ...
- BZOJ 4827 [Shoi2017]分手是祝愿 ——期望DP
显然,考虑当前状态最少需要几步,直接贪心即可. 显然我们只需要考虑消掉这几个就好了. 然后发现,关系式找出来很简单,是$f(i) f(i+1) f(i-1)$之间的. 但是计算的时候并不好算. 所以把 ...
- [BZOJ4872][六省联考2017]分手是祝愿(期望DP)
4872: [Shoi2017]分手是祝愿 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 516 Solved: 342[Submit][Statu ...
- Bzoj4872: [Shoi2017]分手是祝愿
题面 Bzoj Sol 首先从大向小,能关就关显然是最优 然后 设\(f[i]\)表示剩下最优要按i个开关的期望步数,倒推过来就是 \[ f[i]=f[i-1]*i*inv[n]+f[i+1]*(n- ...
- 【BZOJ4872】【SHOI2017】分手是祝愿 期望DP
题目大意 有\(n\)盏灯和\(n\)个开关,初始时有的灯是亮的,有的灯是暗的.按下第\(i\)个开关会使第\(j\)盏灯的状态被改变,其中\(j|i\).每次你会随机操作一个开关,直到可以通过不多于 ...
- BZOJ4872: [Shoi2017]分手是祝愿【概率期望DP】【思维好题】
Description Zeit und Raum trennen dich und mich. 时空将你我分开.B 君在玩一个游戏,这个游戏由 n 个灯和 n 个开关组成,给定这 n 个灯的初始状态 ...
- [六省联考2017]分手是祝愿 期望DP
表示每次看见期望的题就很懵逼... 但是这题感觉还是值得一做,有可借鉴之处 要是下面这段文字格式不一样的话(虽然好像的确不一样,我也不知道为什么,是直接从代码里面复制出来的,因为我一般都是习惯在代码里 ...
随机推荐
- 【转】iOS 自动化性能采集
前言 对于iOS总体生态是比较封闭的,相比Android没有像adb这种可以查看内存.cpu的命令.在日常做性能测试,需要借助xcode中instruments查看内存.cpu等数据. 但是借助i ...
- 189. Rotate Array(Array)
Rotate an array of n elements to the right by k steps. For example, with n = 7 and k = 3, the array ...
- f5基本介绍
1.信息查看 1)登录: https://10.160.100.10 f5有2台,做HA IP地址分别为10.160.100.3和10.160.100.2 10.160.100.10为虚拟地址 2)基 ...
- stark组件之pop操作【模仿Django的admin】
一.先看下什么django的admin的pop到底是个什么东西 其实就是这么一个东西, a.在添加页面,在一对多和多对多的项后加了一个+号 b.点击这个加号,会弹出对应的添加 页面,在新的添加 c.添 ...
- Java03-Java语法基础(二)运算符
Java语法基础(二)运算符 一.运算符 1.算数运算符:+.-.*./.% 1)双目运算符:二元运算符,参加运算的对象有两个(+.-.*./.%) 2)单目运算符:一元运算符,参加运算的对象只有一个 ...
- 线特征---LineMatching代码运行(五)
[1] https://github.com/dlut-dimt/LineMatching The code is based on Matlab. https://github.com/ka ...
- Oracle管理表空间和数据文件详解
介绍 表空间是数据库的逻辑组成部分 从物理上将:数据库数据存放在数据文件中 从逻辑上将:数据库则是存放在表空间中 表空间由一个或是多个数据文件组成 数据库的逻辑结构 介绍: Oracle中逻辑结构包括 ...
- vue学习视频网址(各种前端视频 网址)
基础信息详解:https://segmentfault.com/blog/vueroad 网址:http://biaoyansu.com/18.1
- 不使用SwitchHosts修改C:\Windows\System32\drivers\etc\hosts文件
1.nginx中的nginx.conf完成修改,配置好了端口和域名www.xuecheng.com 2.找到Hosts文件,将Hosts文件复制到桌面.(Windows 10系统Hosts文件路径为: ...
- python学习笔记Day2
字符编码 编程规范(PEP8) 变量1.常量(用大写) 2.变量 常用类型:str .int.float. long.bool 字串格式化: %d 整数 %2d占两位 %02d占两位用0填充 %f 浮 ...