[六省联考2017]分手是祝愿 题解(期望dp)
题目描述
B 君在玩一个游戏,这个游戏由 n 个灯和 n 个开关组成,给定这 n 个灯的初始状态,下标为从 1 到 n 的正整数。
每个灯有两个状态亮和灭,我们用 1 来表示这个灯是亮的,用 0 表示这个灯是灭的,游戏的目标是使所有灯都灭掉。
但是当操作第 i 个开关时,所有编号为 i 的约数(包括 1 和 i)的灯的状态都会被改变,即从亮变成灭,或者是从灭变成亮。
B 君发现这个游戏很难,于是想到了这样的一个策略,每次等概率随机操作一个开关,直到所有灯都灭掉。
这个策略需要的操作次数很多,B 君想到这样的一个优化。如果当前局面,可以通过操作小于等于 k 个开关使所有灯都灭掉,那么他将不再随机,直接选择操作次数最小的操作方法(这个策略显然小于等于 k 步)操作这些开关。
B 君想知道按照这个策略(也就是先随机操作,最后小于等于 k 步,使用操作次数最小的操作方法)的操作次数的期望。
这个期望可能很大,但是 B 君发现这个期望乘以 n 的阶乘一定是整数,所以他只需要知道这个整数对 100003 取模之后的结果。
$Solution:$
好神啊。
首先考虑怎么做才是最优策略,不难得出一个猜想:从右向左操作,能关就关。
感性理解一下,编号小的肯定无法控制编号大的,而每个编号进行操作所影响的集合也是一定的(与它目前的状态无关)。既然编号大的且亮着的迟早都要按,而且影响也是确定的,那不如先按它确定了状态来进行接下来的处理。
另外,这样显然每个灯最多操作一次,所以最优步数一定不大于n。
对于每个状态,最优策略是唯一确定的,那么我们就可以用最优策略下的操作数来代表每个状态。
如果在$i$状态进行正确的操作,$i$就会变成$i-1$。反之,如果操作不正确,它就会变成$i+1$。
对随机的部分,设$dp[i]$为从$i$到$i-1$所需的期望步数。
根据之前的推论,不难得到:$dp[i]=1 \times \frac{i}{n} + \frac{n-i}{n} \times (dp[i]+dp[i+1]+1)$
按对了一步跳过去,按错了回到$i+1$,还需要$dp[i+1]+dp[i]+1$才能跳到$i-1$。
化简得到$dp[i]=\frac{(n-i)dp[i+1]+n}{i}$,先求个$\sum$,再和采取最优策略部分的步数拼一下就是答案。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
const int N=1e5+5;
typedef long long ll;
const ll mod=1e5+3;
int n,K,a[N];
vector<int> fact[N];
ll fac=1,ans,dp[N];
ll qpow(ll x,ll y)
{
ll res=1;x=x%mod;
while(y)
{
if(y&1)res=res*x%mod;
x=x*x%mod;
y>>=1;
}
return res;
} void ini()
{
for(int x=1;x<=n;x++)
{
fac*=1LL*x,fac%=mod;
for(int i=1;i*i<=x;i++)
{
if(x%i)continue;
if(i*i==x)fact[x].push_back(i);
else fact[x].push_back(i),fact[x].push_back(x/i);
}
}
} int main()
{
scanf("%d%d",&n,&K);
ini();
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
int step=0;
for(int i=n;i;i--)
{
if(!a[i])continue;
step++;
for(int j=0;j<fact[i].size();j++)
a[fact[i][j]]^=1;
}
if(step<=K)
{
printf("%lld\n",1LL*step*fac%mod);
return 0;
}
for(int i=n;i>K;i--)
{
ll inv=qpow(i,mod-2);
dp[i]=(1LL*(n-i)*dp[i+1]%mod+n%mod)%mod;
(dp[i]*=inv)%=mod;
}
for(int i=K+1;i<=step;i++)
(ans+=dp[i])%=mod;
(ans+=K)%=mod;
(ans*=fac)%=mod;
cout<<ans<<endl;
return 0;
}
[六省联考2017]分手是祝愿 题解(期望dp)的更多相关文章
- luoguP3750 [六省联考2017]分手是祝愿 概率期望DP + 贪心
...........真的神状态了,没办法去想的状态................... 考试的时候选择$50$分贪心+$15$分状压吧,别的点就放弃算了........ 令$f[i]$表示从最小步 ...
- BZOJ4872 [六省联考2017]分手是祝愿 【期望dp】
题目 Zeit und Raum trennen dich und mich. 时空将你我分开.B 君在玩一个游戏,这个游戏由 n 个灯和 n 个开关组成,给定这 n 个灯的初始状态,下标为 从 1 ...
- 洛谷P3750 [六省联考2017]分手是祝愿(期望dp)
传送门 嗯……概率期望这东西太神了…… 先考虑一下最佳方案,肯定是从大到小亮的就灭(这个仔细想一想应该就能发现) 那么直接一遍枚举就能$O(nlogn)$把这个东西给搞出来 然后考虑期望dp,设$f[ ...
- [六省联考2017]分手是祝愿(期望+DP)
题解 很容易想出来最优策略是什么. 就是从n到1看到开着的灯就把它关了 我们预处理出当前状态把灯全部关闭后的最少步数cnt 然后我们的主人公就要瞎按... 设dp[i]代表当前状态最优解为i步时走到d ...
- 洛谷 P3750 - [六省联考2017]分手是祝愿(期望 dp)
题面传送门 首先我们需注意到这样一个性质:那就是对于任何一种状态,将其变为全 \(0\) 所用的最小步数的方案是唯一的--考虑编号为 \(n\) 的灯,显然如果它原本是暗着的就不用管它了,如果它是亮着 ...
- BZOJ 4872 luogu P3750 [六省联考2017]分手是祝愿
4872: [Shoi2017]分手是祝愿 Time Limit: 20 Sec Memory Limit: 512 MB[Submit][Status][Discuss] Description ...
- bzoj千题计划266:bzoj4872: [六省联考2017]分手是祝愿
http://www.lydsy.com/JudgeOnline/problem.php?id=4872 一种最优解是 从大到小灯有亮的就灭掉 最优解是唯一的,且关灯的顺序没有影响 最优解 对每个开关 ...
- [BZOJ4872][六省联考2017]分手是祝愿(期望DP)
4872: [Shoi2017]分手是祝愿 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 516 Solved: 342[Submit][Statu ...
- [BZOJ4872][六省联考2017]分手是祝愿
BZOJ Luogu sol 首先发现肯定有解,又因为每个位置至多操作一次,所以最优解一定是在\([0,n]\)之间 有一种可以在\(O(\sum_{i=1}^{n}\lfloor\frac{n}{i ...
随机推荐
- R 数据分析
目录: windows命令行中执行R dataframe 常用函数.变量 1.windows命令行中执行R 前提:已经把R的命令目录加入了系统路径中. 在windows中,命令行执行R可以用以下两种方 ...
- Bootstrap 学习笔记3 路径分页标签和徽章组件
- Ajax 中Post 与 Get的 实例
Ajax中 Post 与 Get 实例 Ajax的POST实例,index.html <html> <head> <script type="text/ja ...
- shell编程:sed的选项
sed [参数] [partern/commond] file 标准输出 | sed sed [参数] [partern/commond] -n :使用安静(silent)模式.在一般 sed 的用法 ...
- Mybatis的分支选择和In循环
Mybatis的分支选择: <choose> <when test="patientNo != null and patientNo != ''"> and ...
- redis-3.0.0安装
redis-3.0.0安装 前言 redis是常用的no-sql数据库,常用于缓存数据,同时,他也可以持久化数据.他是C语言开发的,所以安装的时候需要编译. 单机版redis yum install ...
- SQL数据库—<7>事务、异常和游标
事务 一.什么是事务能够保证数据的一致性的代码控制,要么执行提交,要么滚回事务的初始状态 二.事务的四大特性:ACIDA:原子性-------事务不可拆开,要么执行要么回滚无中间状态C:一致性---- ...
- SQL数据库—<5>视图、索引…简单学习
视图 掌握:1.视图是个什么东西?2.会建视图,会查视图3.知道视图的主要功能是查询,不是增删除改. 视图的定义: 视图可以认为是从一个数据表或者多个数据表中导出的表,视图本身没有任何数据,它是用来存 ...
- 从vue的组件传值着手浅谈观察者模式
首先,提到观察者模式,这不禁让我想到了MVVM,MVVM架构模式感觉用到了观察者的思想. 我们还是按照惯例,了解一下什么是观察者模式 观察者模式,类似发布订阅模式,完成这个动作首先最少得有两个不同的对 ...
- Linux中各类程序的配置文件位置
目录 Linux中各类程序的配置文件位置 1.启动引导程序配置文件 2.系统启动文件核脚本 3.网络配置文件 4.超级服务程序配置文件和目录 5.硬件配置 6.硬件访问文件 7.扫描仪配置文件 8.打 ...