ICode9

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

数论 拉格朗日插值 glP5437题解

2022-01-10 16:31:06  阅读:208  来源: 互联网

标签:glP5437 const 插值 题解 sum int sr 2n mod


呃怎么感觉很裸啊(

题意是让求生成树边权之和的期望,那么我们只需要算出所有生成树的边权之和除以生成树边数即可。

由于是求和,我们只需要计算出每条边对答案的贡献即可。

我们知道一个完全图有 \(n^{n-2}\) 棵生成树,那么每条边在其中出现过多少次呢?

很容易发现每一条边的地位是相同的,所以所有边出现的次数相同。

那么出现次数就是 $n^{n-2}\times (n-1) \div \frac {n \times (n-1)} 2 $,也就是 $ 2n^{n-3}$。

答案就是 \(\frac {2n^{n-3} \times (\sum_{i=1}^n\sum_{j=i+1}^n (i+j)^k)} {n^{n-2}}\)。

\[\frac 2 n \times (\sum_{i=1}^n\sum_{j=i+1}^n (i+j)^k) \]

里面的东西给转化一下:

\[\frac 1 2 \times (\sum_{i=1}^n\sum_{j=1}^n (i+j)^k - 2^k\sum_{i=1}^n i^k) \]

我们枚举每一个 \((i+j)\) 的出现次数:

\[\sum_{i=1}^n (i-1)i^k + \sum_{i=n+1}^{2n} (2n+1-i)i^k - 2^k\sum_{i=1}^n i^k \]

\[\sum_{i=1}^n i^{k+1}-\sum_{i=1}^n i^k + (2n+1)\sum_{i=n+1}^{2n} i^k - \sum_{i=n+1}^{2n} i^{k+1} - 2^k\sum_{i=1}^n i^k \]

我们只需要知道自然数的 \(k\) 次和 \(k+1\) 次幂之和即可,使用拉格朗日插值可以做到 \(O(k)\)。

#include<cstdio>
const int M=1e7+5,mod=998244353;
int n,k,sl[M],sr[M],a1[M],a2[M],idk[M],idk1[M],ifac[M];
int top,pri[664580];bool zhi[M];
inline int Add(const int&a,const int&b){
	return a+b>=mod?a+b-mod:a+b;
}
inline int Del(const int&a,const int&b){
	return b>a?a-b+mod:a-b;
}
inline int pow(int a,int b){
	int ans=1;
	for(;b;b>>=1,a=1ll*a*a%mod)if(b&1)ans=1ll*ans*a%mod;
	return ans;
}
inline void sieve(const int&n){
	register int i,j,x;idk[1]=idk1[1]=1;
	for(i=2;i<=n;++i){
		if(!zhi[i])idk[pri[++top]=i]=pow(i,k);
		for(j=1;j<=top&&(x=i*pri[j])<=n;++j){
			zhi[x]=true;idk[x]=1ll*idk[i]*idk[pri[j]]%mod;
			if(!(i%pri[j]))break;
		}
		idk1[i]=1ll*idk[i]*i%mod;
	}
}
inline void init(){
	register int i;sieve(k+3);ifac[0]=ifac[1]=1;k+=2;
	for(i=2;i<=k+1;++i)ifac[i]=1ll*(mod-mod/i)*ifac[mod%i]%mod;
	for(i=2;i<=k+1;++i)ifac[i]=1ll*ifac[i-1]*ifac[i]%mod;
	for(i=1;i<=k;++i)idk[i]=Add(idk[i],idk[i-1]);
	for(i=1;i<=k+1;++i)idk1[i]=Add(idk1[i],idk1[i-1]);
	for(i=1;i<=k;++i){
		idk[i]=1ll*ifac[i-1]*(k-i&1?mod-ifac[k-i]:ifac[k-i])%mod*idk[i]%mod;
	}
	for(i=1;i<=k+1;++i){
		idk1[i]=1ll*ifac[i-1]*(k-i&1?ifac[k+1-i]:mod-ifac[k+1-i])%mod*idk1[i]%mod;
	}
}
inline int fk(const int&n){
	register int i,ans=0;sl[0]=sr[k+1]=1;
	for(i=1;i<=k;++i)sl[i]=1ll*sl[i-1]*Del(n,i)%mod;
	for(i=k;i>=1;--i)sr[i]=1ll*sr[i+1]*Del(n,i)%mod;
	for(i=1;i<=k;++i)ans=Add(ans,1ll*sl[i-1]*sr[i+1]%mod*idk[i]%mod);
	return ans;
}
inline int fk1(const int&n){
	register int i,ans=0;sl[0]=sr[k+2]=1;
	for(i=1;i<=k+1;++i)sl[i]=1ll*sl[i-1]*Del(n,i)%mod;
	for(i=k+1;i>=1;--i)sr[i]=1ll*sr[i+1]*Del(n,i)%mod;
	for(i=1;i<=k+1;++i)ans=Add(ans,1ll*sl[i-1]*sr[i+1]%mod*idk1[i]%mod);
	return ans;
}
signed main(){
	int f1,f2,f3,f4,g1,g2;
	scanf("%d%d",&n,&k);init();f1=fk(n);f2=fk(Add(n,n));f3=fk1(n);f4=fk1(Add(n,n));
	g1=Add(f3,1ll*Add(n,n+1)*Del(f2,f1)%mod);g2=Add(1ll*Add(pow(2,k-2),1)*f1%mod,Del(f4,f3));
	printf("%d",1ll*pow(n,mod-2)*Del(g1,g2)%mod);
}

标签:glP5437,const,插值,题解,sum,int,sr,2n,mod
来源: https://www.cnblogs.com/lmpp/p/15784952.html

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

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

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

ICode9版权所有