首页 > 其他分享 >概率期望DP做题记录-Part3

概率期望DP做题记录-Part3

时间:2023-06-11 16:23:33浏览次数:44  
标签:nonumber frac Part3 做题 DP 操作 期望 步数 dp

概率期望DP做题记录-Part3

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

什么题目名称

题意

给定 \(n\) 个灯的初始状态,每个灯有两个状态亮和灭,通过操作第 \(i\) 个开关,所有编号为 \(i\) 的约数(包括 \(1\) 和 \(i\))的灯的状态都会被改变,即从亮变成灭,或者是从灭变成亮。

你的目标是使所有灯都灭掉。

每次你会等概率随机操作一个开关,直到所有灯都灭掉。

B 君想知道按照这个策略(也就是先随机操作,最后最小操作次数小于等于 \(k\) 步时,再使用操作次数最小的操作方法)的操作次数的期望。

求这个期望乘以 \(n\) 的阶乘对 \(100003\) 取模之后的结果。\(n\le 10^5\)。

做法

先考虑已知这些路灯的亮灭状态,如何求出最小操作次数。

不难发现,从 \(n\) 到 \(1\),有亮的就把它按掉,一定是最优的。

不妨假设当前位置为 \(i\)。

  1. 当 \(i=n\) 时,只能把 \(i\) 按灭掉。
  2. 当 \(1\le i\le n\) 时,假设 \([i+1,n]\) 都灭了。首先,更小的不能让 \(i\) 灭掉。如果试图用更大的把 \(i\) 按掉,那么就会一直需要更大的把按亮的按回去,直到没有更大的能把它按回去,这时候还是要一个一个按回去,不如直接把 \(i\) 按掉。

这样感性理解,就说明了从大到小按掉是最优的做法之一。

对于一个序列,根据刚才的过程,容易发现,需要按一下的点是固定的。因为这个操作是异或,所以顺序没有影响。

现在问题就转化成了,给定一个 \(01\) 串,每次随机选定一个位置异或 \(1\),问变成全 \(0\) 的期望步数。

然后就好做了。容易发现期望步数只与 \(1\) 的个数有关,而且最小操作次数等于 \(1\) 的数量。

不妨设 \(dp_i\) 表示从有 \(i\) 个 \(1\) 变成 \(i-1\) 个 \(1\) 的期望步数。

显然转移为:

\[\begin{align} dp_i&=\frac{i}{n}+\frac{n-i}{n}(dp_i+dp_{i+1}+1)\nonumber\\ dp_i&=\frac{i}{n}+\frac{n-i}{n}dp_i+\frac{n-i}{n}dp_{i+1}+\frac{n-i}{n}\nonumber\\ dp_i&=1+\frac{n-i}{n}dp_i+\frac{n-i}{n}dp_{i+1}\nonumber\\ dp_i-\frac{n-i}{n}dp_i&=1+\frac{n-i}{n}dp_{i+1}\nonumber\\ \frac{i}{n}dp_i&=1+\frac{n-i}{n}dp_{i+1}\nonumber\\ dp_i&=1+\frac{n+(n-i)dp_{i+1}}{i}\nonumber\\ \end{align} \]

直接转移即可。

那么步数的期望就是 \(E=\sum_{i=k+1}^{count}dp_i+k\)。\(count\) 表示初始 \(1\) 的数量。

直接计算即可,记得要乘上 \(n!\)。

代码

void update(int x){
	for(int i=1;i*i<=x;i++){
		if(x%i)continue;
		a[i]^=1;
		if(i*i!=x)a[x/i]^=1;
	}
}
signed main(){
	n=read(),m=read();
	for(int i=1;i<=n;i++)a[i]=read();
	for(int i=n;i;i--){
		if(a[i]){
			update(i);
			++cnt;
		}
	}
	m=min(cnt,m);
	for(int i=n;i;i--)dp[i]=(n+(n-i)*dp[i+1])%mod*inv(i)%mod;
	for(int i=m+1;i<=cnt;i++)ans=(ans+dp[i])%mod;
	ans+=m;
	for(int i=1;i<=n;i++)ans=ans*i%mod;
	cout<<ans;
	return 0;
}

标签:nonumber,frac,Part3,做题,DP,操作,期望,步数,dp
From: https://www.cnblogs.com/Augury/p/17472994.html

相关文章

  • 如何将CHATGPT 整合到WordPress上使用
    CHATGPT出来有一段时间了,一直想琢磨怎么在我们网站上使用CHATGPT, https://www.3cseller.com/ 使用WordPressAjax请求https://api.openai.com/v1/chat/completions返回openai结果,做一个chatgpt在线问答功能  functionopenai_chat_request(){ $content=$......
  • 【做题记录】ADAUNIQ - Ada and Unique Vegetable
    link做法:带修莫队#include<cstdlib>#include<cmath>#include<cstdio>#include<cctype>#include<algorithm>typedeflonglongLL;typedefunsignedlonglongULL;namespaceFastIo{typedef__uint128_tULLL;staticcharbuf[10......
  • 矩阵乘法与动态 DP 入门
    矩阵乘法及广义矩阵乘法前置知识:矩阵相关基础概念。记\(A(i,j)\)表示矩阵\(A\)的第\(i\)行第\(j\)列,\(n_A\)为\(A\)的行数,\(m_A\)为\(A\)的列数。定义矩阵加法\(A+B\)为(\(n_A=n_B,m_A=m_B\)):\[\\\\\[A+B](i,j)=A(i,j)+B(i,j)\]矩阵加法有交换律,结合......
  • 去掉或修改页面底部的「动力源自 Bravada & WordPress.」字样
    打开:……/wp-content/themes/bravada/includes/core.php定位至位于第400行左右的「bravada_master_footer」处;做相应修改。参考:https://blog.csdn.net/qq_45790384/article/details/127335865......
  • [CTSC1997] 选课(树状DP)
    刚接触树状DP,好难啊QAQ[CTSC1997]选课题目描述在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习。现在有 N 门功课,每门课有个学分,每门课有一门或没有直接先修课(若课程a是......
  • python网络爬虫--爬取各省GDP
    一、选题背景1.随着经济全球化的日益深入发展,各国的经济发展也日益重要。在中国,省份是经济发展的基本单位,各省之间经济发展水平的差异较大。了解各省份GDP的数据情况,对于政府部门制定地区经济政策、企业拓展市场等具有重要的参考意义。2.因此,通过Python爬取各省份GPD数据,可......
  • mutate-joins {dplyr}:变异联接
    可变联接将列从y添加到x,并根据键值匹配行:inner_join():包括x和y中的所有行。left_join():包括x中的所有行。right_join():包括y中的所有行。full_join():包括x或y中的所有行。如果x中的一行与y中的多行匹配,则y中的所有行将针对x中的每个匹配行返回一次。......
  • 【做题笔记】做题经验总结
    1.int*int会爆int,记得开longlong2.一般情况下,对于一棵树,树根没有父亲3.一定要看输入和输出格式4.多测不清空,爆零两行泪......
  • UDP编程
    字节序概念:是指多字节数据的存储顺序小端格式:将低位字节数据存储在低地址(LSB)大端格式:将高位字节数据存储在低地址(MSB)特点1、网络协议指定了通讯字节序—大端2、只有在多字节数据处理时才需要考虑字节序3、运行在同一台计算机上的进程相互通信时,一般不用考虑字节序4、异构......
  • 使用Python提取JPEG图像文件dpi并计算物理尺寸
    感谢浙江省浦江中学方春林老师提供的问题、测试图像和第一版本的代码!下面的代码需要安装Python图像处理库pillow,由于不同公司对JPEG压缩算法和格式的实现不完全一样,有些类型的jpg文件暂时无法提取dpi信息,如果找到好的办法的话后期会再进行补充。fromosimportlistdirfromPILim......