首页 > 其他分享 >P8989 [北大集训 2021] 随机游走

P8989 [北大集训 2021] 随机游走

时间:2023-05-25 12:56:14浏览次数:61  
标签:dfrac ll P8989 a1 EX 2021 mod 集训 mathrm

Link

给一张 \(n\) 个点的有向图,初始对于 \(\forall i\in [1, n-1]\),在 \(i\) 与 \(i+1\) 之间有一条有向边

在其中再加入 \(m\) 条有向边,允许重边和自环,最大化从 \(1\) 到 \(n\) 的期望步数

我们可以注意到几条简单的性质

  1. 为了尽可能最大化期望步数,所有边都会往 \(1\) 连
  2. 不可能从 \(n\) 连出边

设 \(\mathrm{EX}(p)\) 为从 \(p\) 出发到 \(n\) 的期望距离,点 \(p\) 连了 \(a_p\) 条边出来,那么

\[\mathrm{EX}(p)=\dfrac{1}{a_p+1}\mathrm{EX}(p+1)+\dfrac{a_p}{a_p+1}\mathrm{EX}(1)+1 \]

而有 \(\mathrm{EX}(n)=0\)

\[\begin{aligned} \mathrm{EX}(n-1)&=\dfrac{a_{n-1}}{a_{n-1}+1}\mathrm{EX}(1)+1\\ \mathrm{EX}(n-2) &=\dfrac{a_{n-2}}{a_{n-2}+1}\mathrm{EX}(1) +\dfrac{1}{a_{n-2}+1}(\mathrm{EX}(n-1))+1\\ &=\dfrac{a_{n-2}}{a_{n-2}+1}\mathrm{EX}(1) +\dfrac{1}{a_{n-2}+1}(\dfrac{a_{n-1}}{a_{n-1}+1}\mathrm{EX}(1)+1)+1\\ &=\dfrac{a_{n-2}(a_{n-1}+1)+a_{n-1}}{(a_{n-2}+1)(a_{n-1}+1)}\mathrm{EX}(1)+\dfrac{a_{n-2}+2}{a_{n-2}+1} \end{aligned} \]

令 \(t_k=\prod_{i=k}^{n-1}(a_i+1)\)

\[\begin{aligned} \mathrm{EX}(n-2) &=\dfrac{t_{n-2}-1}{t_{n-2}}\mathrm{EX}(1)+\dfrac{a_{n-2}+2}{a_{n-2}+1} \end{aligned} \]

接下来

\[\begin{aligned} \mathrm{EX}(n-3) &=\dfrac{a_{n-3}}{a_{n-3}+1}\mathrm{EX}(1) +\dfrac{1}{a_{n-3}+1}(\mathrm{EX}(n-2))+1\\ &=\dfrac{a_{n-3}}{a_{n-3}+1}\mathrm{EX}(1) +\dfrac{1}{a_{n-3}+1}(\dfrac{t_{n-2}-1}{t_{n-2}}\mathrm{EX}(1)+\dfrac{a_{n-2}+2}{a_{n-2}+1})+1\\ &=\dfrac{a_{n-3}t_{n-2}+t_{n-2}-1}{t_{n-3}}\mathrm{EX}(1)+\dfrac{a_{n-2}+2+(a_{n-3}+1)(a_{n-2}+1)}{(a_{n-3}+1)(a_{n-2}+1)}\\ &=\dfrac{t_{n-3}-1}{t_{n-3}}\mathrm{EX}(1)+\dfrac{\sum_{i={n-3}}^{n-2}\frac{t_{i}}{a_{n-1}+1}+1}{\frac{t_{n-3}}{a_{n-1}+1}}\\ \mathrm{EX}(n-4) &=\dfrac{a_{n-4}}{a_{n-4}+1}\mathrm{EX}(1) +\dfrac{1}{a_{n-4}+1}(\mathrm{EX}(n-3))+1\\ &=\dfrac{a_{n-4}}{a_{n-4}+1}\mathrm{EX}(1)+\dfrac{1}{a_{n-4}+1}(\dfrac{t_{n-3}-1}{t_{n-3}}\mathrm{EX}(1)+\dfrac{\sum_{i={n-3}}^{n-2}\frac{t_{i}}{a_{n-1}+1}+1}{\frac{t_{n-3}}{a_{n-1}+1}})+1\\ &=\dfrac{t_{n-4}-1}{t_{n-4}}\mathrm{EX}(1)+\dfrac{\sum_{i=n-4}^{n-2}\frac{t_i}{a_{n-1}+1}+1}{\frac{t_{n-4}}{a_{n-1}+1}} \end{aligned} \]

那么我们就有了一般的形式

\[\begin{aligned} \mathrm{EX}(k) &=\dfrac{t_k-1}{t_k}\mathrm{EX}(1)+\dfrac{\sum_{i=k}^{n-2}\frac{t_i}{a_{n-1}+1}+1}{\frac{t_k}{a_{n-1}+1}}\\ &=\dfrac{t_k-1}{t_k}\mathrm{EX}(1)+\dfrac{\sum_{i=k}^{n-2}t_i}{t_k}+\dfrac{a_{n-1}+1}{t_k}\\ \end{aligned} \]

所以

\[\begin{aligned} \mathrm{EX}(1) &=\dfrac{t_1-1}{t_1}\mathrm{EX}(1)+\dfrac{\sum_{i=1}^{n-2}t_i}{t_1}+\dfrac{a_{n-1}+1}{t_1}\\ &=\sum_{i=1}^{n-2}t_i+a_{n-1}+1\\ &=\sum_{i=1}^{n-1}t_i\\ &=\sum_{i=1}^{n-1}\prod_{j=i}^{n-1}(a_j+1) \end{aligned} \]

爆搜一下数列 \(a\) 就可以狂砍 \(20\rm{pts}\) 了!

现在的问题就在于最大化 \(\sum_{i=1}^{n-1}\prod_{j=i}^{n-1}(a_j+1)\)

观察可以发现在越靠后的位置,对于 \(a_i\) 对答案的贡献应该是更大的,应该尽可能大

对于 \(m < n-1\) 的情况,容易想到在 \(n-m\sim n-1\) 之间各放一个是最好的

当 \(m\ge n-1\) 的情况,整个序列分为三段,第一段为 \(a_1=\lfloor\dfrac{m-(n-2)}{n-1}\rfloor\),第二段为 \(2\sim n-(m-a_1-(n-2)(a_1+1))-1\),其中 \(a\) 的值为 \(a_1+1\),最后一段是 \(n-(m-a_1-(n-2)(a_1+1))\sim n-1\),其中 \(a\) 的值为 \(a_1+2\)

可以证明这是最优的分配方案,否则可以调整得到更优的方案

然后直接做就可以了,在相同的段内等比数列求和即可

如果一定要从小到大枚举的话可以换一下形式

\[\begin{aligned} \sum_{i=1}^{n-1}\prod_{j=i}^{n-1}(a_j+1) &=\sum_{i=1}^{n-1}\dfrac{\prod_{j=1}^{n-1}(a_j+1)}{\prod_{j=1}^{j=i-1}(a_j+1)}\\ &=\prod_{i=1}^{n-1}(a_i+1)\sum_{i=1}^{n-1}\bigg(\prod_{j=1}^{i-1}(a_j+1)\bigg)^{-1} \end{aligned} \]

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>

typedef long long ll;
using namespace std;
ll n, m, mod;
ll a1, ans;

ll f_pow(ll a, ll k) {
	a %= mod;
	ll base = 1;
	for(; k; k >>= 1, a = (a * a) % mod) {
		if(k & 1)
			base = (base * a) % mod;
	}
	return base;
}

ll Plus(ll a, ll b) {
	a += b;
	return a >= mod ? a - mod : a;
}

ll Minu(ll a, ll b) {
	a -= b;
	return a < 0 ? a + mod : a;
}

//等比数列求和,首项为a,公比为p,长度为len
ll SequenceSum(ll a, ll p, ll len) {
	p %= mod;
	return a % mod * Minu(1, f_pow(p, len)) % mod * f_pow(Minu(1, p), mod - 2) % mod;
}

int main() {
	int T;
	scanf("%d", &T);
	while(T--) {
		scanf("%lld%lld%lld", &n, &m, &mod);
		if(m < n - 1) {
			ll sum1 = SequenceSum(2, 2, m);
			ll sum2 = f_pow(2, m) * (n - m - 1) % mod;
			printf("%lld\n", Plus(sum1, sum2));
			continue;
		}
		if(n == 1) {
			printf("0\n");
			continue;
		}
		a1 = (m - n + 2) / (n - 1);
		ll res = m - a1 - (n - 2) * (a1 + 1);
		ll mid = n - res - 1;

		if(mid == 1) {
			ll sum1 = SequenceSum(a1 + 3, a1 + 3, (n - 1) - 1);
			ll prod = f_pow(a1 + 3, (n - 1) - 1);
			ll sum2 = (a1 + 1) % mod * prod % mod;
			printf("%lld\n", Plus(sum1, sum2));
		} else if(mid == n - 1) {
			ll sum1 = SequenceSum(a1 + 2, a1 + 2, (n - 1) - 1);
			ll prod = f_pow(a1 + 2, (n - 1) - 1);
			ll sum2 = (a1 + 1) % mod * prod % mod;
			printf("%lld\n", Plus(sum1, sum2));
		} else {
			ll sum1 = SequenceSum(a1 + 3, a1 + 3, res);
			ll prod1 = f_pow(a1 + 3, res);
			ll sum2 = SequenceSum(prod1 * ((a1 + 2) % mod) % mod, a1 + 2, mid - 1);
			ll prod2 = f_pow(a1 + 2, mid - 1);
			ll sum3 = (a1 + 1) % mod * prod2 % mod * prod1 % mod;
			printf("%lld\n", Plus(sum1, Plus(sum2, sum3)));
		}
	}
	return 0;
}

标签:dfrac,ll,P8989,a1,EX,2021,mod,集训,mathrm
From: https://www.cnblogs.com/lostintianyi/p/17430833.html

相关文章

  • Luogu P1903 [国家集训队] 数颜色 / 维护队列
    题目来源https://www.luogu.com.cn/problem/P1903[国家集训队]数颜色/维护队列题目描述墨墨购买了一套\(N\)支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问。墨墨会向你发布如下指令:\(Q\L\R\)代表询问你从第\(L\)支画笔到第\(R\)支画笔中共有几种......
  • 2021四川省赛
    The2021SichuanProvincialCollegiateProgrammingContestA-Chuanpai#include<bits/stdc++.h>usingnamespacestd;voidsolve(){ intk; cin>>k; intans=0; for(inti=1;i<=6;i++) for(intj=i;j<=6;j++) if(i+j==k) ans++; co......
  • HEUCPC2021
    stralReflection在\([1,n]\)上支持如下操作:操作一:学习一个新的技能——清除\([l,r]\)内所有的陨石操作二:给定一个点集\(k\)代表陨石出现在这些位置,询问最少需要使用多少技能才能清除所有陨石(不能使用当前没有学习的技能)共操作\(m\)次\(\sumk\leq1e5\)\(m\leq1e5\)......
  • 科技云报道荣膺全球云计算大会“云鼎奖”2020-2021年度优秀团队
    2021年6月16日-18日,第九届全球云计算大会·中国站(CloudConnectChina)在宁波隆重举行。本次大会上,科技云报道荣膺全球云计算大会“云鼎奖”2020-2021年度优秀团队奖项。科技云报道团队代表上台领奖(左一)科技云报道荣膺“云鼎奖”2020-2021年度优秀团队作为每年全球云计算大会·中国......
  • Audition 2021 for Mac软件安装包下载Au 2021软件安装教程
    [名称]:Audition2021[大小]:473MB[语言]:简体中文 [安装环境]:MacOS10.14及以上[是否支持M系列芯片]:支持[简介]:Audition是一种完善工具集,其中包括用于对音频内容进行创建、混音和编辑的多音轨、波形和光谱显示。这一强大的音频工作站旨在加快视频制作工作流程和音频修整的速度,并且......
  • ID2021Mac软件安装教程Indesign 2021 for Mac软件安装包下载
    [名称]:InDesign2021[大小]:1.29GB[语言]:简体中文 [安装环境]:MacOS10.14及以上[是否支持M系列芯片]:支持[简介]:InDesign是一个定位于专业排版领域的设计软件。借助这款业界领先的页面设计和版面应用程序,可以制作、印前检查和发布用于印刷和数字媒体出版的精美文档。InDesign拥有制......
  • June 2021-Continuous Transition: Improving Sample Efficiency for Continuous Cont
    摘要:尽管深度强化学习(RL)已成功应用于各种机器人控制任务,但由于样本效率较差,将其应用于现实世界任务仍然具有挑战性。为了克服这一缺点,一些工作侧重于在训练过程中重用收集的轨迹数据,将其分解为一组策略无关的离散变迁。然而,它们的改进有些边际,因为i)转换的数量通常很小,ii)值分......
  • 【蓝桥杯集训·每日一题】AcWing 3728. 城市通电
    写在前面本人CSDN博客主页:这里一、题目1、原题链接3728.城市通电2、题目描述平面上遍布着n座城市,编号1∼n。第i座城市的位置坐标为(xi,yi)。不同城市的位置有可能重合。现在要通过建立发电站和搭建电线的方式给每座城市都通电。一个城市如果建有发电站,或者通过电线直接或间......
  • CSP-J2021试题题解
    1.分糖果原题:https://www.luogu.com.cn/problem/P7909原代码:#include<bits/stdc++.h>#definelllonglongusingnamespacestd;lln,l,r;intmain(){ cin>>n>>l>>r; if(r%n==n-1)cout<<n-1; elseif(l%n==n-1)cout<<n-1; elseif(......
  • 洛谷 P9248 - [集训队互测 2018] 完美的集合
    显然,如果选择的\(k\)个“合法集合”固定了,那么可以放置装置的点如果存在,那么必然形成一个连通块,也就是说,答案等于所有合法方案中,可以放置装置的点形成的连通块个数之和。而根据点减边的套路,这等价于,枚举每个点,计算有多少种方案满足可以在其放置装置,再枚举每条边,计算有多少种方案......