首页 > 其他分享 >Codeforces 1657E Star MST

Codeforces 1657E Star MST

时间:2024-02-14 11:22:35浏览次数:22  
标签:Star 个点 int 边权 1657E 扩展 Codeforces i64 maxn

记边权上限为 \(W\)。

转化一下即为 \((1, i)(i\in [2, n])\) 的边组成的也是原图的最小生成树。

考虑 \(\text{Prim}\) 的方法求最小生成树。
从 \(1\) 号点开始扩展,每次都会选取距离当前已扩展到的点最近的点 \(u\)。
为了保证 \((1, u)\) 的边在最小生成树中,需要满足对于已经扩展到的且不为 \(1\) 的点 \(v\),\(w_{(u, v)}\ge w_{(1, u)}\),因为否则 \((1, u)\) 对于 \((u, v)\) 就一定不优一定不会在最小生成树。

观察到这个就可以开始做了,考虑 \(\text{DP}\)。
令 \(f_{i, j}\) 为考虑了 \(1\sim i\) 的边权,除 \(1\) 外已经扩展了 \(j\) 个点的方案数。
转移考虑枚举当前边权 \(i\) 扩展了几个点出来,令其为 \(k\),那么 \(k\) 个点内部的边权需要 \(\ge i\),同时已经扩展且不为 \(1\) 的 \(j - k\) 个点与这 \(k\) 个点的边权需要 \(\ge i\),从原本剩下的 \(n - j\) 中选出 \(k\) 个点的方案数为 \(\binom{n - j}{k}\)。
所以 \(f_{i - 1, j - k}\) 对 \(f_{i, j}\) 的贡献的系数为 \(\binom{n - j}{k}\times (W - i + 1)^{\binom{k}{2} + k\times (j - k)}\),同时也可以不扩展,即 \(f_{i - 1, j}\) 对 \(f_{i, j}\) 的贡献的系数为 \(1\)。
初始值 \(f_{0, 0} = 1\),答案即为 \(f_{W, n - 1}\)。

时间复杂度 \(O(Wn^2\log n)\),可以预处理幂做到 \(O(Wn^2)\)。

#include<bits/stdc++.h>
using i64 = long long;
const i64 mod = 998244353;
inline i64 qpow(i64 a, i64 b) {
    i64 v = 1;
    while (b) b & 1 && ((v *= a) %= mod), (a *= a) %= mod, b >>= 1;
    return v;
}
const int maxn = 250 + 10;
i64 C[maxn][maxn], f[maxn][maxn];
int main() {
    int n, W; scanf("%d%d", &n, &W);
    n--;
    for (int i = 0; i <= n; i++) {
        C[i][0] = 1;
        for (int j = 1; j <= i; j++) C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % mod;
    }
    f[0][0] = 1;
    for (int i = 1; i <= W; i++) for (int j = 0; j <= n; j++) {
        f[i][j] = f[i - 1][j];
        for (int k = 0; k < j; k++) (f[i][j] += f[i - 1][k] * C[n - k][j - k] % mod * qpow(W - i + 1, k * (j - k) + (j - k) * (j - k - 1) / 2)) %= mod;	
    }
    printf("%lld\n", f[W][n]);
    return 0;
}

标签:Star,个点,int,边权,1657E,扩展,Codeforces,i64,maxn
From: https://www.cnblogs.com/rizynvu/p/18015093

相关文章

  • CodeForces 1931G One-Dimensional Puzzle
    洛谷传送门CF传送门什么[ABC336G]16Integers究极弱化版。把元素\(1\)看成\(01\),元素\(2\)看成\(10\),元素\(3\)看成\(11\),元素\(4\)看成\(00\)。则转化为统计长度为\(2\)的子串\(xy\)出现次数为\(c_{xy}\)的\(01\)串个数。把子串\(xy\)看成\(x\to......
  • Codeforces Round 113 (Div. 2)E. Tetrahedron(dp、递推)
    目录题面链接题意题解代码总结题面链接E.Tetrahedron题意从一个顶点出发走过路径长度为n回到出发点的方案总数题解考虑dp\(f[i][0|1|2|3]\):走了i步,现在在j点的方案总数转移:\(f[i][0]=f[i-1][1]+f[i-1][2]+f[i-1][3]\)\(f[i][1]=f[i-1][0]+f[i-1][2]+f[i-1][3]\)\(f......
  • Codeforces Round 169 (Div. 2)C. Little Girl and Maximum Sum(差分、贪心)
    目录题面链接题意题解代码总结题面链接C.LittleGirlandMaximumSum题意给q个[l,r]将所有这些区间里面的数相加和最大。可以进行的操作是任意排列数组题解对出现的每个区间内的位置加上1,代表权值操作完之后求一遍前缀和,得到每个位置的权值然后贪心的考虑,权值越大,应......
  • CodeForces 1928F Digital Patterns
    洛谷传送门CF传送门为什么我场上被卡常了。转化题意,将\(a,b\)差分,答案为在\(a,b\)选出相同长度的不含\(0\)的子段方案数。设\(a\)选出长度为\(i\)的不含\(0\)的子段方案数为\(x_i\),\(b\)选出长度为\(i\)的不含\(0\)的子段方案数为\(y_i\)。答案为\(\su......
  • Codeforces Round 729 (Div. 2)B. Plus and Multiply(构造、数学)
    题面链接B.PlusandMultiply题意给定\(n,a,b\)可以进行的操作\(*a\)\(+b\)最开始的数是1问能否经过上面的两种操作将1变为n题解这题的关键是能不能想出来这个集合里面的数的统一的表达形式所有数都可以表示为\(a^x+y*b\)然后只要存在\(x\)和\(y\),使得\(a^x+y*......
  • Codeforces Round 922 (Div. 2) A~C
    A.BrickWall#include<bits/stdc++.h>usingnamespacestd;voidsolve(){intn,m;cin>>n>>m;intans=n*(m/2);cout<<ans<<"\n";}intmain(){ ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); int......
  • Codeforces Round 923 (Div. 3)
    A.MakeitWhite#include<bits/stdc++.h>usingnamespacestd;voidsolve(){ inta,b,n; strings; cin>>n>>s; for(inti=0;i<n;i++){ if(s[i]=='B'){ a=i; break; } } for(inti=n-1;i>=0;i--){ if(s[i]=='B&......
  • Codeforces Round 924 (Div. 2)
    B.Equalize与数组的原始顺序无关,直接排序,然后用双指针滑动范围a[r]-a[l]小于n#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;voidsolve(){ intn; cin>>n; set<int>st; for(inti=1;i<=n;i++){ intx; cin>>x; st.insert(x); } ......
  • Codeforces Round 924 (Div. 2)
    1928D-LonelyMountainDungeons题意:有\(n\)个种族,第\(i\)个种族\(c_i\)个生物,现在要将这些生物分成若干组,每一对不在同一组但是同一种族的生物会对这种分组的价值贡献\(b\),如果分了\(k\)组,则价值要减去\((k-1)x\),求最大价值。\(n\le10^5,\sumc_i\le10^5\)思......
  • Codeforces Round 303 (Div. 2)C. Kefa and Park(DFS、实现)
    @目录题面链接题意题解代码总结题面链接C.KefaandPark题意求叶节点数量,叶节点满足,从根节点到叶节点的路径上最长连续1的长度小于m题解这道题目主要是实现,当不满足条件时直接返回。到达叶节点后统计答案,用vector存图的话,无向图时,叶节点的边只有一条,也就是\(g[i].size()......