题意:Takuru 是一名能力者,他在地震时获得了念力致动的能力。所以他经常用自己的能力去干一些奇奇怪怪的事情。有一天他获得了一张 nn 个点的无向完全图,之后他使用了能力,导致这张图的 n(n1)2\frac{n(n-1)}{2} 条边中的每一条都有 xy\frac{x}{y} 的概率遭到破坏而消失。现在 Takuru 想知道这张无向图点集的全部 2n2^n 个的子集中,是独立集的子集数量的期望值。一张无向图 GG 的一个子集是独立集的定义如下:此点集 SS,满足对于任意的 x,ySx, y \in S,图 GG 中不存在连接 xxyy 的边。(空集也是一个合法的独立集)

很简单的一道题。

对于每一个大小为 ii 的点集,那么点两两之间共有 i(i1)2\frac{i(i-1)}{2} 条边,要把这些边删完才能变成独立集,那么概率为 (xy)i(i1)2(\frac{x}{y})^{\frac{i(i-1)}{2}}

答案就是 i=0nC(ni)×(xy)i(i1)2\sum_{i=0}^nC\binom{n}{i}\times (\frac{x}{y})^{\frac{i(i-1)}{2}},注意取模和爆 long long,也不要取模过多而时间超限。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
long long n,x,y,mod=998244353,ans;
long long fac[101010],inv[101010];
long long power(long long a,long long b,long long p)
{
	long long ans=1%p;
	for(;b;b>>=1)
	{
		if(b&1)
			ans=ans*a%p;
		a=a*a%p;
	}
	return ans%p;
}
int main()
{
	scanf("%lld%lld%lld",&n,&x,&y);
	fac[0]=1;
	inv[0]=1;
	for(int i=1;i<=n;i++)
	{
		fac[i]=fac[i-1]*i%mod;
		inv[i]=power(fac[i],mod-2,mod);
	}
	long long p=x*power(y,mod-2,mod)%mod;
	for(int i=0;i<=n;i++)
	{
		long long t=fac[n]*inv[i]%mod*inv[n-i]%mod;
		t=t*power(p,1ll*(i-1)*i/2,mod)%mod;
		ans+=t;
	}
	printf("%lld",ans%mod);
	return 0;
}