【BZOJ4872】【SHOI2017】分手是祝愿 期望DP
题目大意
有\(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\)盏灯期望操作次数,有:
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的更多相关文章
- 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 ... 
- P3750 [六省联考2017]分手是祝愿 期望DP
		\(\color{#0066ff}{ 题目描述 }\) Zeit und Raum trennen dich und mich. 时空将你我分开. B 君在玩一个游戏,这个游戏由 \(n\) 个灯和 ... 
- BZOJ4872: [Shoi2017]分手是祝愿【概率期望DP】【思维好题】
		Description Zeit und Raum trennen dich und mich. 时空将你我分开.B 君在玩一个游戏,这个游戏由 n 个灯和 n 个开关组成,给定这 n 个灯的初始状态 ... 
- 2018.11.01 bzoj4872: [Shoi2017]分手是祝愿(期望dp)
		传送门 一道不错的题. 考虑n==kn==kn==k的时候怎么做. 显然应该从nnn到111如果灯是开着的就把它关掉这样是最优的. 不然如果乱关的话会互相影响肯定不如这种优. 于是就可以定义状态f[i ... 
- Bzoj4872: [Shoi2017]分手是祝愿
		题面 Bzoj Sol 首先从大向小,能关就关显然是最优 然后 设\(f[i]\)表示剩下最优要按i个开关的期望步数,倒推过来就是 \[ f[i]=f[i-1]*i*inv[n]+f[i+1]*(n- ... 
随机推荐
- for 循环 以及基本的数据类型
			for 循环: for 关键字 i 变量(此处可以更改 更改规则参考变量命名规则) in 关键字 可迭代对象 (想要循环谁就放谁,注意:数字除外 因为数字不可迭代) for 循环内可以进行任意操作,可 ... 
- 【RSYSLOG】Log4x To Rsyslog Config
			Log4x To Rsyslog Config Log4net配置 <!--RemoteSyslogAppender--> <appender name="remoteSy ... 
- 利用lnmp一键安装的php环境忘记mysql,root用户密码解决方法
			1.cd /lnmp1.5/tools/ 2.sh reset_mysql_root_password.sh 这样,即可完成修改! 
- stark组件配置,二层URL
			1.django的admin配置 2 stark组件开发 3.2层url分发 4.小结 1.django的admin配置 model.py from django.db import models # ... 
- java开发中使用枚举表述数据字典
			一.用枚举表述数据字典 1.代码: package com.inspire.jdk.caculate; /** * Created by yaming * 用枚举表述常量数据字段 */ public ... 
- 【学习总结】Git学习-参考廖雪峰老师教程十-自定义Git
			学习总结之Git学习-总 目录: 一.Git简介 二.安装Git 三.创建版本库 四.时光机穿梭 五.远程仓库 六.分支管理 七.标签管理 八.使用GitHub 九.使用码云 十.自定义Git 期末总 ... 
- Java 基本数据类型 及 == 与 equals 方法的区别
			Java数据类型分为基本数据类型与引用数据类型. 1 基本数据类型 byte:Java中最小的数据类型,在内存中占1个字节(8 bit),取值范围-128~127,默认值0 short:短整型,2个字 ... 
- 转:MD5(Message-Digest Algorithm 一种哈希算法)
			什么是MD5算法 MD5讯息摘要演算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码杂凑函数,可以产生出一个128位元(16位元组)的散列值(hash val ... 
- linux  安装 SVN  server
			安装 使用yum安装非常简单: yum install subversion 配置 2.1. 创建仓库 我们这里在/home下建立一个名为svn的仓库(repository),以后所有代码都放在这个下 ... 
- 《Effective C++》让自己习惯C++:条款1-条款4
			条款1:视C++为一个语言联邦 可以将C++分为4个层次: 1.C:C++实在C语言的基础上发展而来的. 2:Object-Oriented C++:C++面向对象. 3:Template C++:C ... 
