首页 > 其他分享 >CodeForces 1726E Tree Sum

CodeForces 1726E Tree Sum

时间:2023-01-01 17:46:44浏览次数:64  
标签:子树 1726E 奇数 Sum Tree long ll 边权 mod

洛谷传送门

CF 传送门

不错的一道 Combinatorics。

结论 1: \(n\) 为奇数时答案为 \(0\)。

设 \(d_i\) 为与点 \(i\) 相连的边边权乘积。每加入一条边对两端的 \(d_i\) 贡献乘积为 \(-1\),因此 \(\prod d_i = 1\)。当 \(n\) 为奇数时要求 \(\prod d_i = -1\),不合法。

结论 2: 树的形态确定后,合法的填边权方案只有一种。

考虑从叶子开始自底向上,显然可以依次确定边权。

结论 3: 若一条边两端点连接的子树大小为奇数,则边权为 \(-1\),否则为 \(1\)。

仍然考虑自底向上归纳证明。对于连接叶子的边显然满足。设当前非叶子结点为点 \(u\),如果连向儿子的边中有奇数条是 \(-1\),那么说明 \(sz_u\) 为偶数,并且 \(u \to fa_u\) 的边权为 \(1\)。反之说明 \(sz_u\) 为奇数,并且 \(u \to fa_u\) 的边权为 \(-1\)。

考虑枚举 \(1 \to n\) 路径上的每条边算贡献。枚举 \(1\) 所在子树的点数 \(i\),则 \(n\) 所在子树点数为 \(n - i\)。边权可以由 \(i\) 的奇偶性确定,考虑算方案数。从两棵子树分别拎出一个根,再从剩下 \(n - 2\) 个点选 \(i - 1\) 个点作为 \(1\) 所在子树。最后根据题目给出的公式得出 \(n\) 个点的有标号无根树数量为 \(n^{n-2}\),可得方案数为 \(i^{i-1}(n-i)^{n-i-1}\binom{n-2}{i-1}\)。

code
/*

p_b_p_b txdy
AThousandSuns txdy
Wu_Ren txdy
Appleblue17 txdy

*/

#include <bits/stdc++.h>
#define pb push_back
#define fst first
#define scd second
#define mems(a, x) memset((a), (x), sizeof(a))

using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
typedef pair<ll, ll> pii;

const int maxn = 500100;
const ll mod = 998244353;

ll qpow(ll b, ll p) {
	ll res = 1;
	while (p) {
		if (p & 1) {
			res = res * b % mod;
		}
		b = b * b % mod;
		p >>= 1;
	}
	return res;
}

ll n, fac[maxn], ifac[maxn];

inline ll C(ll n, ll m) {
	if (n < m || n < 0 || m < 0) {
		return 0;
	} else {
		return fac[n] * ifac[m] % mod * ifac[n - m] % mod;
	}
}

void solve() {
	scanf("%lld", &n);
	if (n & 1) {
		puts("0");
		return;
	}
	fac[0] = 1;
	for (int i = 1; i <= n; ++i) {
		fac[i] = fac[i - 1] * i % mod;
	}
	ifac[n] = qpow(fac[n], mod - 2);
	for (int i = n - 1; ~i; --i) {
		ifac[i] = ifac[i + 1] * (i + 1) % mod;
	}
	ll ans = 0;
	for (int i = 1; i < n; ++i) {
		ans = (ans + ((i & 1) ? mod - 1 : 1LL) * qpow(i, i - 1) % mod * qpow(n - i, n - i - 1) % mod * C(n - 2, i - 1) % mod) % mod;
	}
	printf("%lld\n", ans);
}

int main() {
	int T = 1;
	// scanf("%d", &T);
	while (T--) {
		solve();
	}
	return 0;
}

标签:子树,1726E,奇数,Sum,Tree,long,ll,边权,mod
From: https://www.cnblogs.com/zltzlt-blog/p/17018330.html

相关文章

  • P2398 GCD SUM——欧拉函数
    此题可以拓展为\(\sum\limits^n_{i=1}\sum\limits^m_{j=1}\gcd(i,j)\)结论是\(\sum\limits^{\min(n,m)}_{d=1}\varphi(d)\lfloor\dfrac{n}{d}\rfloor\lfloor\dfrac{m}{......
  • 洛谷P4146 序列终结者 题解 splay tree
    题目链接:​​https://www.luogu.com.cn/problem/P4146​​题目大意:支持:区间更新(+x)区间翻转区间查询(最大值)解题思路:几乎和​​AcWing2437.Splay​​这题一模一样。示例程......
  • Sumitomo Mitsui Trust Bank Programming Contest 2019 —— B
    也不知道这比赛为啥要取这么长的名称(传送门:https://atcoder.jp/contests/sumitrust2019/tasks/sumitb2019_e哈哈,你被骗了!但网址是真的!题意有红绿蓝三种帽子RedandBl......
  • Blood Cousins Return DSU on tree
    #include<bits/stdc++.h>usingnamespacestd;constintN=2e6+10;intn,m,Maxdep;map<string,int>name;vector<int>mp[N];vector<pair<int,int>>qus[N]......
  • BTree与B+Tree图文详解--转
    简介: B树与B+树区别一、前言磁盘I/O:是指磁盘的输入和输出(Input和Output的缩写)。二叉查找树:左子树的键值小于根的键值,右子树的键值大于根的键值。二叉查找......
  • list转json tree的工具类
    packagecom.glodon.safety.contingency.job;importcom.alibaba.fastjson.JSON;importcom.alibaba.fastjson.JSONArray;importcom.alibaba.fastjson.JSONObject;i......
  • 【CF1481F】AB Tree(单调队列优化多重背包)
    容易看出答案下界是树的最大深度,且构造方法只能是每一层的节点都染成同种颜色,可行性的判断是个背包问题。然后发现若不可行,就把除最后一层外的其它层每层都染成同种颜色,然......
  • MySQL中B-Tree和B+Tree创建过程
    1.B-Tree以一颗最大度数为5(5阶)的B-tree为例,每个节点最多存储4个key,5个指针。意味着:在一个有n个key的节点中,有n+1个指针,原理如下图:现在,依次存入如下数据:200、100、400、......
  • Potree 001 Potree介绍
    1、Potree是什么Potree是一种基于WebGL的点云数据可视化解决方案,包含点云数据转化,以及进行可视化的源码。该解决方案的主要优势在于对点云数据进行了多尺度的管理,在数据传......
  • tree reconstruct 834
    834. SumofDistancesinTreeHardThereisanundirectedconnectedtreewith n nodeslabeledfrom 0 to n-1 and n-1 edges.Youaregiventhe......