ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-01-18 08:32:03  阅读:223  来源: 互联网

标签:局面 六省 ans 次数 maxn 按钮 P3750 操作 联考


题意:

戳这里

分析:

我们发现,高位的按钮会影响到低位的按钮,但低位的按钮不会影响到高位,也就是说,我们得到了一个贪心求得最小策略的方法,那就是从高位向低位,灯亮就按按钮

得到了策略之后我们要开始考虑怎么算的操作次数的期望,我们不难发现,操作次数的期望和局面没有直接关系了,因为我们可以求出每一种局面下的最优策略操作顺序不影响局面的形成,所以操作次数为 \(i\) 的局面可以看成一种等价的类,这就提示我们按照操作次数为状态进行 DP,我们设 \(f_i\) 表示从 \(i\) 次操作的局面转移向 \(i-1\) 次操作的局面的期望次数

每次有两种转移:

  1. 直接按对剩下的 \(i\) 次操作中的一个按钮,直接转移
  2. 按错了按钮,回到了 \(i+1\) 次的局面,必须先回到 \(i\) 次,再转移向 \(i-1\)

易得转移式如下:

\(f_i=\frac{i}{n}+\frac{n-i}{n}\times(f_{i+1}+f_i+1)\)

移项化简得到

\(f_i=\frac{n+(n-i)\times f_{i+1}}{i}\)

然后先处理出初始局面的最优操作次数,和 \(k\) 比较一下,大于的话 DP 求出到 \(k\) 的期望次数再 \(+k\) , 不然直接就是最优操作次数

代码:

#include<bits/stdc++.h>
#define pii pair<int,int>
#define mk(x,y) make_pair(x,y)
#define lc rt<<1
#define rc rt<<1|1
#define pb push_back
#define fir first
#define sec second
#define inl inline
#define reg register

using namespace std;

namespace zzc
{
	inline int read()
	{
		int x=0,f=1;char ch=getchar();
		while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
		while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
		return x*f;
	}
	
	const int maxn = 1e5+5;
	const int mod = 1e5+3;
	int n,k,ans,cnt;
	vector<int> p[maxn];
	int sta[maxn],f[maxn],inv[maxn];
	
	void work()
	{
		n=read();k=read();
		inv[0]=inv[1]=1;
		for(int i=1,j=1;i<=n;i++,j=i) 
		{
			sta[i]=read();
			if(i!=1) inv[i]=1ll*inv[mod%i]*(mod-mod/i)%mod;
			while(j<=n)
			{
				p[j].pb(i);
				j+=i;
			}
		}
		for(int i=n;i;i--) 
		{
			if(sta[i]) {cnt++;for(auto j:p[i]) sta[j]^=1;}
			f[i]=1ll*(n+1ll*(n-i)*f[i+1]%mod)%mod*inv[i]%mod;
		}
		if(cnt<=k) ans=cnt;
		else
		{
			for(int i=cnt;i>k;i--) ans=(ans+f[i])%mod;
			ans=(ans+k)%mod;
		}
		for(int i=1;i<=n;i++) ans=1ll*ans*i%mod;
		printf("%d\n",ans);
	}

}

int main()
{
	zzc::work();
	return 0;
}

标签:局面,六省,ans,次数,maxn,按钮,P3750,操作,联考
来源: https://www.cnblogs.com/youth518/p/14291071.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有