Maximum Diameter 题解
Maximum Diameter
题目大意
定义长度为
- 所有的
n 个点的第i 个点的度数为a_i 的树的直径最大值,如果不存在这样的树,其权值为0 。
给定
思路分析
- 范德蒙德卷积:
\sum\limits_{i=0}^k{n\choose i}{m\choose k-i}={n+m\choose k}
一式可以直接拆组合数简单证明,二式通过组合意义显然成立。
然后我们就可以通过以上两个式子对所求式进行化简了:
化到这样就可以
代码
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
const int N = 2002000, L = 2000000, mod = 998244353;
#define int long long
int fac[N], inv[N];
int T, n;
int q_pow(int a, int b){
int res = 1;
while (b) {
if (b & 1) res = (res * a) % mod;
a = (a * a) % mod;
b >>= 1;
}
return res;
}
int C(int n, int m){
if(n < m || n < 0 || m < 0) return 0;
return fac[n] * (inv[m] * inv[n - m] % mod) % mod;
}
signed main(){
fac[0] = 1;
for (int i = 1; i <= L; i ++) fac[i] = fac[i - 1] * i % mod;
inv[L] = q_pow(fac[L], mod - 2);
for (int i = L; i >= 1; i --) inv[i - 1] = inv[i] * i % mod;
scanf("%lld", &T);
while (T --) {
scanf("%lld", &n);
int res1 = (n - 1) * C(2 * n - 3, n - 1) % mod;
int res2 = (n - 3) * C(2 * n - 4, n - 3) % mod;
int ans = (res1 - res2 + mod) % mod;
cout << ans << '\n';
}
return 0;
}