首页 > 其他分享 >【XSY3395】逃亡(概率与期望,组合数)

【XSY3395】逃亡(概率与期望,组合数)

时间:2022-10-30 11:13:04浏览次数:50  
标签:ch 期望 整点 int 逃亡 mul XSY3395 sum define

首先 “被经过的整点的期望个数” 不好求,我们可以把它看成 “每个整点被经过的概率的和”。

对于某个整点,求 “它被任意一个人经过的概率” 不好求,我们可以求 “它不被任意一个人经过的概率”,那么现在的问题是求某个整点不被某个人经过的概率,或者说求某个整点被某个人经过的概率。

把这个人看作原点,然后设这个整点的坐标为 \(i\)(不妨设 \(i\geq 0\),\(i<0\) 同理)。考虑转化到坐标-时间图像上,现在问题转化为:从原点开始走,每一步能往右上/右下走,求走 \(n\) 步,过程中碰到直线 \(y=i\) 的走法方案数,最后除个 \(2^n\) 即为概率。

在这里插入图片描述

(本文所有图片均引用自题解的 PPT)

类似卡特兰数,我们考虑翻折:对于一条碰到 \(y=i\) 且终点 \(j<i\) 的折线,我们找到它第一次碰到 \(y=i\) 的位置,并把这条折线在这个位置之后的所有部分都沿 \(y=i\) 做翻折,那么就得到了一条终点在 \(j'>i\) 的折线:

在这里插入图片描述

而且显然任意一条终点在 \(j'>i\) 的折线,都唯一对应着一条终点在 \(j'\) 的折线(它自己),以及一条终点在 \(j\) 的折线(上述翻折过程的逆过程得到的折线)。

那么如果设 \(E(i)\) 表示终点在 \(i\) 的走法方案数,那么碰到直线 \(y=i\) 的走法方案数即为:

\[E(i)+2\sum_{j>i} E(j) \]

\(E(i)\) 也比较好求:容易得到终点在 \(i\) 需要向上走 \(\frac{n+i}{2}\) 步,于是 \(E(i)=[n\equiv i\pmod 2]\dbinom{n}{\frac{n+i}{2}}\)。

那么我们直接枚举每一个可能经过的整点(\(O(nm)\) 个),再对枚举的整点枚举每一个人,时间复杂度 \(O(nm^2)\)。

#include<bits/stdc++.h>

#define M 25
#define N 12000010
#define fi first
#define se second
#define pii pair<int,int>
#define mk(a,b) make_pair(a,b)
#define INF 0x7fffffff

using namespace std;

namespace modular
{
	const int mod=998244353;
	inline int add(int x,int y){return x+y>=mod?x+y-mod:x+y;}
	inline int dec(int x,int y){return x-y<0?x-y+mod:x-y;}
	inline int mul(int x,int y){return 1ll*x*y%mod;}
}using namespace modular;

inline int poww(int a,int b)
{
	int ans=1;
	while(b)
	{
		if(b&1) ans=mul(ans,a);
		a=mul(a,a);
		b>>=1;
	}
	return ans;
}

inline int read()
{
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9')
	{
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		x=(x<<1)+(x<<3)+(ch^'0');
		ch=getchar();
	}
	return x*f;
}

int n,m,x[M];
int fac[N],ifac[N],E[N];

vector<pii>part;

int C(int n,int m)
{
	return mul(mul(fac[n],ifac[m]),ifac[n-m]);
}

int calc(int now)
{
	int p=1;
	for(int i=1;i<=m;i++)
		if(abs(now-x[i])<=n)
			p=mul(p,dec(1,E[abs(now-x[i])]));
	return dec(1,p);
}

int main()
{
	n=read(),m=read();
	int inv=poww(poww(2,n),mod-2);
	fac[0]=1;
	for(int i=1;i<=n;i++) fac[i]=mul(fac[i-1],i);
	ifac[n]=poww(fac[n],mod-2);
	for(int i=n;i>=1;i--) ifac[i-1]=mul(ifac[i],i);
	int sum=0;
	for(int i=n;i>=0;i--)
	{
		int nowE=0;
		if(!((i&1)^(n&1))) nowE=mul(inv,C(n,(n+i)/2));
		E[i]=add(nowE,mul(sum,2));
		sum=add(sum,nowE);
	}
	for(int i=1;i<=m;i++)
	{
		x[i]=read();
		part.push_back(mk(x[i]-n,x[i]+n));
	}
	sort(part.begin(),part.end());
	int lstr=-INF,ans=0;
	for(pii now:part)
	{
		int l=now.fi,r=now.se;
		l=max(l,lstr+1);
		for(int i=l;i<=r;i++)
			ans=add(ans,calc(i));
		lstr=max(lstr,r);
	}
	printf("%d\n",ans);
	return 0;
}
/*
2 1
1
*/

标签:ch,期望,整点,int,逃亡,mul,XSY3395,sum,define
From: https://www.cnblogs.com/ez-lcw/p/16840755.html

相关文章

  • 【XSY3338】game(期望,点分治,FFT)
    题面game题解首先可以看出“等概率选连通块->连通块内等概率选点”相当于“全局等概率选点”。一开始感觉无从下手,但是题目中还是给了一点提示。题目让我们输出答......
  • 【CF553E】Kyoya and Train(期望dp,SPFA,FFT)
    考虑dp。发现正着dp好像不太好做,毕竟初值不太好设,而且时间一大于\(t\)费用就要加上\(x\),所以考虑倒着dp。设\(f_{u,j}\)表示现在已经到达\(u\)点,耗时\(j\),问......
  • 「REMAKE系列」概率期望dp篇
    常见模型技巧总结概率正推,期望倒推简单概率期望简单分类讨论。P1297[国家集训队]单选错位根据题目推导。UVA11021Tribles需要一些小观察的题目01最终位置确定,倒......
  • 【luogu P6130】随机红包(数学)(期望)
    随机红包题目链接:luoguP6130题目大意把一个数1分成n份,求第k小的期望大小,多次询问。思路首先考虑最小的期望大小,那假设最小的是\(x\),剩下的都大于\(x\)。那......
  • 牛客练习赛104 D 逃亡的贝贝
    https://ac.nowcoder.com/acm/contest/43058/D思路二分答案,对于超过当前答案并且操作后可以使用的边边权当做1,短边当做0,跑一遍最短路,非常经典的二分题代码#include<alg......
  • 给年轻的自己的建议:不要对副业抱太大期望
    我一直对依附于一家公司的想法持怀疑态度。这可能是因为我在法国那一代人的左派精神,或者因为我在学生时代的阅读,或者因为我的家族历史(看到自营职业者、农民、护士或教师比公......
  • ARC150D - Removing Gacha (树上期望)
    Link题意:给一棵\(n\)个节点的树,称一个点是好的,当且仅当它到根的路径上都是黑色(包括自己)。每次在不好的节点中随机选一个把它涂成黑色(不管原来它是否是白的),直到所有点都......
  • 2020CCPC威海 C Rencontre(树形DP,期望)
    题意:有3个人,每个人有一些待选位置。就是当确定三个人确定位置u1,u2,u3后,需要找到一个位置v到三个位置的距离之和最小,现在给出u1,u2,u3的待选取值,问距离......
  • Leetcode简单题背后的数学规律 | LCP 11. 期望个数统计
    最近签到打卡,每日额外再刷两道题攒积分。遇到一个简单题LCP11.期望个数统计,挺有意思的,记录一下分析过程并重温概率学知识。题目给定n个数的数组scores,小A和小B负责......
  • luogu P3232 [HNOI2013]游走 (期望, 高斯消元)
    https://www.luogu.com.cn/problem/P3232思路:算出每条边的期望访问次数,将期望访问次数多的赋予小的编号。一条边的期望访问次数=访问点u的期望/u的度+访问点v的期望......