首页 > 其他分享 >题解:P10881「KDOI-07」能量场

题解:P10881「KDOI-07」能量场

时间:2024-08-22 16:18:41浏览次数:12  
标签:P10881 tv 题解 sum KDOI int 1ll 权值 mod

\(\text{Link}\)

题意

给你一个长为 \(n\) 的序列 \(a_{1\dots n}\),定义一条边 \((u,v)\) 的权值为 \(a_u+a_v\)。对于一张图,定义其权值为包含的所有边的权值乘积。求所有 \(n\) 个点的有标号基环树的权值之和。对 \(998244353\) 取模。

\(n\le 10^3\)。

思路

非常厉害的题,zky 倾情提供 solution。只讲述对正解有意义的几个 sub。

\(n\le 18\)

考虑基环树把环缩起来就是一颗树,而树的权值乘积很自然就能想到矩阵树定理,我们不妨枚举哪些点在环上,我们可以 DP 求出这些点构成的环的权值和,然后将这些点缩起来(边权、度数相加)做一次矩阵树定理,为了方便我们可以将代表这个环的点删去。

时间复杂度 \(O(2^nn^3)\),期望得分 \(25\)。

\(n\le 20\)

我们不妨研究一下我们需要求行列式的矩阵的性质。我们需要求 \(\det(D-A)\),其中 \(D\) 只有对角线位置有值且 \(D_{i,i}=na_i+\sum_{j=1}^na_j\),\(A_{i,j}=a_i+a_j\),不妨设 \(d_i=D_{i,i}\)。

由行列式的基本性质,我们可以将求 \(\det(D-A)\) 看成选取一个行的集合 \(S\),将矩阵 \(D\) 在集合内的行替换为 \(-A\) 对应的行,对于所有 \(S\) 求替换后的矩阵的行列式之和。

观察出矩阵 \(A\) 的一个重要性质:\(A\) 中任意三行线性相关。于是我们只需要考虑大小不超过 \(2\) 的 \(S\)。

根据行列式的定义式,我们可以简单地将行列式求出:

  • \(|S|=0\),\(\prod_{i=1}^nd_i\);
  • \(|S|=1\),\(-2\sum_{i=1}^na_i\prod_{j\ne i}d_j\);
  • \(|S|=2\),\(\sum_{i=1}^n\sum_{j=i+1}^n(2a_ia_j-a_i^2-a_j^2)\prod_{k\ne i,k\ne j}d_k\)。

需要注意 \(d_i\) 在模意义下等于 \(0\) 的情况。

时间复杂度 \(O(2^nn^2)\),期望得分 \(30\)。

\(n\le 200\)

我们尝试进一步对特殊的边权进行处理。

对于环上的部分,我们需要给定点集对于每一种可能的环求出边权的乘积之和,注意到边权是 \(a_i+a_j\) 的形式,而环上的点度数又恰为 \(2\),所以每个点对答案的贡献只可能是 \(a_i^0,a_i^1,a_i^2\) 之一!

注意到点的编号对环没有影响,我们只需要考虑环上分别有有 \(i,j,k\) 个点对答案的贡献次幂为 \(0,1,2\) 时可以形成多少个环即可。不妨将边权为 \(a_u+a_v\) 看成给 \((u,v)\) 这条边定向,将指向的那个点的权值乘入答案,每个点对答案的贡献次幂即为它的入度。对于上述问题,

  • 首先有 \(j+2k=i+j+k\) 即 \(i=k\);
  • 先将入度为 \(0,2\) 的点放在环上,显然只能交替放,分配方案的编号为 \(i!(i-1)!\),注意环可以翻转,方案数要除以二;
  • 再将入度为 \(1\) 的点依次插入环中,由于这些点入度出度都为 \(1\),可以任意插入两个点之间,方案数为 \(\dfrac{(2i+j-1)!}{(2i-1)!}\)。

即 \(i\) 个 \(0,2\) 度点、\(j\) 个 \(1\) 度点构成环的方案数为 \(\dfrac{i!(i-1)!(2i+j-1)!}{2(2i-1)!}\),特判 \(i=0\) 时方案数为 \((j-1)!\)。

于是我们依次将每个点划分给环内/环外,进行一个 DP,设 \(f_{i,a,b,c,p,q}\) 表示考虑前 \(i\) 个点,划分给环内的点分别有 \(a,b,c\) 个贡献了 \(0,1,2\) 次幂,环外钦定的 \(S\) 内的点分别为 \(p,q\) 时的答案和,转移 \(i\) 时枚举 \(i\) 划分给哪一部分并算入对应贡献即可。而 \(p,q\) 这两维也可以在转移到时并入计算,于是我们得到了一个状态为四维,转移 \(O(1)\) 的做法。

时间复杂度 \(O(n^4)\),期望得分 \(90\)。

\(n\le 1000\)

回想一下,\(d_i=na_i+\sum_{j}a_j\),再回看上述式子,我们发现环外的部分对答案的贡献同样是 \(a_i\) 的 \(0,1,2\) 次幂之一!

再考虑求出全局中 \(0,1,2\) 次幂分别有 \(i,j,k\) 个时对答案的贡献系数。不妨考虑先枚举一个环,环上 \(0,1,2\) 次幂分别有 \(i,j,i\) 个,再枚举环外的 \(|S|\) 和有几个 \(d_p\) 选择了其中的 \(na_p\),分配标号并乘上一些 \(n\) 和 \(\sum a\) 即可。

再 DP 求出 \(0,1,2\) 次幂分别有 \(i,j,k\) 个时的和,注意到 \(i+j+k=n\),我们可以省去一维,于是状态变为三维。

时间复杂度 \(O(n^3)\),可以通过。

参考代码:

int n,sv,v[N],fac[N],ifac[N],inv[N],pw0[N],pw1[N],C[N][N],g[N][N];
int f[N][N][2];
inline void Prefix(int n){
	fac[0]=1;
	for(int i=1;i<=n;i++)
		fac[i]=1ll*i*fac[i-1]%mod;
	ifac[n]=qpow(fac[n],mod-2);
	for(int i=n;i;i--)
		ifac[i-1]=1ll*i*ifac[i]%mod;
	for(int i=1;i<=n;i++)
		inv[i]=1ll*ifac[i]*fac[i-1]%mod;
	pw0[0]=pw1[0]=1;
	for(int i=1;i<=n;i++)
		pw0[i]=1ll*pw0[i-1]*n%mod,
		pw1[i]=1ll*pw1[i-1]*sv%mod;
}
int main(){
	n=read();
	for(int i=1;i<=n;i++)
		v[i]=read(),inc(sv,v[i]);
	Prefix(n);
	int in=qpow(n,mod-2);
	for(int i=0;i<=n;i++){
		C[i][0]=1;
		for(int j=1;j<=n;j++)
			C[i][j]=add(C[i-1][j-1],C[i-1][j]);
	}
	for(int i=0;i<=n;i++)
		for(int j=0;i+i+j<=n;j++){
			if(i+j+i<=2) continue;
			int v;
			if(!i) v=fac[j-1];
			else v=1ll*fac[i]*fac[i-1]%mod*fac[i+i+j-1]%mod*ifac[i+i-1]%mod*ifac[2]%mod;
			for(int l=0,p=n-i-i-j-l,tv=1ll*v*pw0[p]%mod;p>=0;l++,p--,tv=1ll*tv*sv%mod*in%mod)
				inc(g[i+l][j+p],1ll*tv*C[i+l][i]%mod*C[j+p][p]%mod);
			for(int l=0,p=n-i-i-j-1-l,tv=1ll*v*pw0[p]%mod;p>=0;l++,p--,tv=1ll*tv*sv%mod*in%mod)
				dec(g[i+l][j+p+1],2ll*tv*C[i+l][i]%mod*C[j+p][p]%mod*(j+p+1)%mod);
			for(int l=0,p=n-i-i-j-2-l,tv=1ll*v*pw0[p]%mod;p>=0;l++,p--,tv=1ll*tv*sv%mod*in%mod)
				dec(g[i+l+1][j+p],1ll*tv*C[i+l][i]%mod*C[j+p][p]%mod*(i+l+1)%mod*(i+1)%mod),
				inc(g[i+l][j+p+2],1ll*tv*C[i+l][i]%mod*C[j+p][p]%mod*(j+p+2)%mod*(j+p+1)%mod);
		}
	int r=1;
	f[0][0][0]=1;
	for(int i=0;i<n;i++,r^=1)
		for(int a=0;a<=i;a++)
			for(int b=0;a+b<=i;b++){
				if(!f[a][b][r^1]) continue;
				int t=f[a][b][r^1],x=v[i+1];
				int tx=1ll*t*x%mod,tx2=1ll*tx*x%mod;
				inc(f[a+1][b][r],t);
				inc(f[a][b+1][r],tx);
				inc(f[a][b][r],tx2);
				f[a][b][r^1]=0;
			} 
	r^=1;
	int ans=0;
	for(int a=0;a<=n;a++)
		for(int b=0;a+b<=n;b++)
			inc(ans,1ll*f[a][b][r]*g[a][b]%mod);
	write(ans);
	flush();
}

标签:P10881,tv,题解,sum,KDOI,int,1ll,权值,mod
From: https://www.cnblogs.com/cyffff/p/18374114

相关文章

  • 题解:P10698 [SNCPC2024] 最大流
    \(\text{Link}\)题意给定一个\(n\)个点\(m\)条边的单位网络,保证该网络不存在环。给定一个常数\(k\),设从\(1\)到\(i\)的最大流为\(f_i\),对\(\foralli\in[2,n]\)求出\(\min(f_i,k)\)。\(n\le10^5\),\(m\le2\times10^5\),\(k\le\min(n-1,50)\)。思路不相交路径,考......
  • 升级Openssh 后 最大文件打开数修改不生效,启动 UsePAM yes后 ,最大文件打开数生效但是
    感谢 博主https://blog.csdn.net/Daphnisz/article/details/124040904vi /etc/pam.d/sshd(注意不是/etc/pam.d/sshd.pam)#%PAM-1.0auth required pam_sepermit.soauthsubstackpassword-authauthincludepostlogin#Usedwithpolkittoreauthor......
  • 常见问题解决 --- 为什么我们常常发现服务器没有管理的端口
    我们在扫描一台主机全端口,发现没有开放管理端口,比如windows远程桌面或者是linux的ssh登陆。我列举一下常见的原因。常规管理方式:1.管理口不是常见的3389和22端口,而改为了高位端口号,避免被人发现。2.在管理端口上加上了安全策略导致无法直接连接,比如私钥登陆方......
  • 题解:CF1986B Matrix Stabilization
    洛谷传送门题意一个\(n\timesm\)的矩阵,依次进行以下操作:从\((1,1)\)开始遍历矩阵,找到最小的\((i,j)\)满足\(a{i,j}\)的值严格大于其所有相邻(四联通)单元格的值,如果没有则退出将1操作找到的\(a_{i,j}-1\)返回1操作求最后的矩阵。思路模拟,我们按照题目所说,从......
  • 题解:P7020 [NWRRC2017] Boolean Satisfiability
    题目传送门题目大意给定一个由大小写字母(变量),|和~组成的布尔代数式,变量可以任意赋值为True或False。求对于给定的变量,有多少种赋值方案使得给定的代数式值为True。思路一个一个看,首先考虑|,先假设只有|,则当代数式中有一个变量为True时,代数式的值变为True。因为每一......
  • 题解:P9788 [ROIR 2020 Day2] 区域规划
    题目传送门思路首先我们看下数据范围,$n<=3000$,范围很小,所以暴力枚举。于是第一份代码出来了。#include<bits/stdc++.h>usingnamespacestd;ints,a,b,c,d,n,m;intmain(){ ios::sync_with_stdio(false); cin.tie(),cout.tie(); cin>>n>>m; for(a=1;a<=n;a++) {......
  • 题解:P9784 [ROIR 2020 Day1] 超速
    传送门思路我们设\(T\)为所花的总时间,\(d\)为超速多少。然后不难知道$T=\sum_{i=1}^{n}\frac{l_i}{v_i+d}$,所以我们实际上是要找到符合条件最小的\(d\)。再结合题目所说最高被罚款的金额最少,然后二分枚举答案即可。时间复杂度\(O(nq\log(m))\)。AC代码#include......
  • 题解:P10892 SDOI2024
    题解:P10892SDOI2024题目传送门题目思路通过阅读题面,我们可以看出,其实对于每一次纠结,如果交出了\(\frac{n-1}{2}\)只猫猫,则剩下的为\(\frac{n+1}{2}\)只猫猫;如果交出了\(\frac{n+1}{2}\)只猫猫,则剩下的为\(\frac{n-1}{2}\)只猫猫。为了使纠结的次数尽可能小,我们要交出......
  • 启动应用程序出现pspluginwkr.dll找不到问题解决
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个pspluginwkr.dll文件(挑选合适的版本文件)把......
  • 启动应用程序出现ptpprov.dll找不到问题解决
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个ptpprov.dll文件(挑选合适的版本文件)把它放......