题目链接

BZOJ5093

题解

点之间是没有区别的,所以我们可以计算出一个点的所有贡献,然后乘上\(n\)

一个点可能向剩余的\(n - 1\)个点连边,那么就有

\[ans = 2^{{n - 1 \choose 2}}n \sum\limits_{i = 0}^{n - 1} {n - 1 \choose i} i^k
\]

显然要求

\[\sum\limits_{i = 0}^{n} {n \choose i} i^k
\]

然后我就不知道怎么做了。。

翻翻题解

有这样一个结论:

\[n^k = \sum\limits_{i = 0}^{k} \begin{Bmatrix} k \\ i \end{Bmatrix} {n \choose i} i!
\]

那么就有

\[\begin{aligned}
\sum\limits_{i = 0}^{n} {n \choose i} i^k &= \sum\limits_{i = 0}^{n} {n \choose i} \sum\limits_{j = 0}^{i} \begin{Bmatrix} k \\ j \end{Bmatrix} {i \choose j}j! \\
&= \sum\limits_{j = 0}^{n}\begin{Bmatrix} k \\ j \end{Bmatrix} j! \sum\limits_{i = j}^{n} {n \choose i} {i \choose j} \\
&= \sum\limits_{j = 0}^{n}\begin{Bmatrix} k \\ j \end{Bmatrix} j! {n \choose j} 2^{n - j} \\
\end{aligned}
\]

解释一下最后一步

\[\sum\limits_{i = j}^{n} {n \choose i} {i \choose j}
\]

直观来看是从\(n\)中取出\(i\)个,然后从\(i\)中取出\(j\)个

实际上等价于从\(n\)中取出\(j\)个,剩余随便取

最后只需要求出第二类斯特林数,用第二类斯特林反演即可

\[\begin{aligned}
\begin{Bmatrix} n \\ m \end{Bmatrix} &= \frac{1}{m!} \sum\limits_{i = 0}^{m} (-1)^{i}{m \choose i}(m - i)^{n} \\
&= \sum\limits_{i = 0}^{m} \frac{(-1)^{i}}{i!} \times \frac{(m - i)^{n}}{(m - i)!} \\
\end{aligned}
\]

\(NTT\)即可

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<map>
#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define mp(a,b) make_pair<int,int>(a,b)
#define cls(s) memset(s,0,sizeof(s))
#define cp pair<int,int>
#define LL long long int
using namespace std;
const int maxn = 800005,maxm = 100005,INF = 1000000000;
inline int read(){
int out = 0,flag = 1; char c = getchar();
while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();}
while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}
return out * flag;
}
const int G = 3,P = 998244353;
inline int qpow(int a,LL b){
int re = 1;
for (; b; b >>= 1,a = 1ll * a * a % P)
if (b & 1) re = 1ll * re * a % P;
return re;
}
int R[maxn];
void NTT(int* a,int n,int f){
for (int i = 0; i < n; i++) if (i < R[i]) swap(a[i],a[R[i]]);
for (int i = 1; i < n; i <<= 1){
int gn = qpow(G,(P - 1) / (i << 1));
for (int j = 0; j < n; j += (i << 1)){
int g = 1,x,y;
for (int k = 0; k < i; k++,g = 1ll * g * gn % P){
x = a[j + k],y = 1ll * g * a[j + k + i] % P;
a[j + k] = (x + y) % P,a[j + k + i] = ((x - y) % P + P) % P;
}
}
}
if (f == 1) return;
int nv = qpow(n,P - 2); reverse(a + 1,a + n);
for (int i = 0; i < n; i++) a[i] = 1ll * a[i] * nv % P;
}
int fac[maxn],inv[maxn],fv[maxn],C[maxn];
int S[maxn],B[maxn],N,K;
void init(){
fac[0] = fac[1] = inv[0] = inv[1] = fv[0] = fv[1] = 1;
for (int i = 2; i <= K; i++){
fac[i] = 1ll * fac[i - 1] * i % P;
inv[i] = 1ll * (P - P / i) * inv[P % i] % P;
fv[i] = 1ll * fv[i - 1] * inv[i] % P;
}
C[0] = 1; int E = min(N - 1,K);
for (int i = 1; i <= E; i++) C[i] = 1ll * C[i - 1] * (N - i) % P * inv[i] % P;
}
void work(){
int n = 1,L = 0;
for (int i = 0; i <= K; i++){
S[i] = (((i & 1) ? -1 : 1) * fv[i] + P) % P;
B[i] = 1ll * qpow(i,K) * fv[i] % P;
}
while (n <= (K << 1)) n <<= 1,L++;
for (int i = 1; i < n; i++) R[i] = (R[i >> 1] >> 1) | ((i & 1) << (L - 1));
NTT(S,n,1); NTT(B,n,1);
for (int i = 0; i < n; i++) S[i] = 1ll * S[i] * B[i] % P;
NTT(S,n,-1);
//REP(i,10) printf("%d ",S[i]); puts("");
int ans = 0;
for (int i = 0; i < N; i++){
if (i > K) break;
ans = (ans + 1ll * S[i] * fac[i] % P * C[i] % P * qpow(2,N - 1 - i) % P) % P;
}
ans = 1ll * ans * N % P * qpow(2,1ll * (N - 1) * (N - 2) / 2) % P;
printf("%d\n",ans);
}
int main(){
N = read(); K = read();
if (N == 1){puts("0"); return 0;}
if (N == 2){puts("2"); return 0;}
init();
work();
return 0;
}

BZOJ5093 [Lydsy1711月赛]图的价值 【第二类斯特林数 + NTT】的更多相关文章

  1. BZOJ 5093: [Lydsy1711月赛]图的价值 第二类斯特林数+NTT

    定义有向图的价值为图中每一个点的度数的 \(k\) 次方之和. 求:对于 \(n\) 个点的无向图所有可能情况的图的价值之和. 遇到这种题,八成是每个点单独算贡献,然后累加起来. 我们可以枚举一个点的 ...

  2. bzoj 5093 [Lydsy1711月赛]图的价值——第二类斯特林数

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5093 不要见到组合数就拆! 枚举每个点的度数,则答案为 \( n*\sum\limits_{ ...

  3. bzoj 5093 图的价值 —— 第二类斯特林数+NTT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5093 每个点都是等价的,从点的贡献来看,得到式子: \( ans = n * \sum\li ...

  4. 【XSY1301】原题的价值 第二类斯特林数 NTT

    题目描述 给你\(n,m\),求所有\(n\)个点的简单无向图中每个点度数的\(m\)次方的和. \(n\leq {10}^9,m\leq {10}^5\) 题解 \(g_n\)为\(n\)个点的无向 ...

  5. bzoj5093:图的价值(第二类斯特林数+NTT)

    传送门 首先,题目所求为\[n\times 2^{C_{n-1}^2}\sum_{i=0}^{n-1}C_{n-1}^ii^k\] 即对于每个点\(i\),枚举它的度数,然后计算方案.因为有\(n\) ...

  6. BZOJ4555 [Tjoi2016&Heoi2016]求和 【第二类斯特林数 + NTT】

    题目 在2016年,佳媛姐姐刚刚学习了第二类斯特林数,非常开心. 现在他想计算这样一个函数的值: S(i, j)表示第二类斯特林数,递推公式为: S(i, j) = j ∗ S(i − 1, j) + ...

  7. bzoj 4555 [Tjoi2016&Heoi2016] 求和 —— 第二类斯特林数+NTT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4555 关于第二类斯特林数:https://www.cnblogs.com/Wuweizhen ...

  8. 【BZOJ4555】【TJOI2016】【HEOI2016】求和 (第二类斯特林数+NTT卷积)

    Description 在2016年,佳媛姐姐刚刚学习了第二类斯特林数,非常开心. 现在他想计算这样一个函数的值: $$f(n)=\sum_{i=0}^n\sum_{j=0}^i S(i,j)\tim ...

  9. P4091 [HEOI2016/TJOI2016]求和(第二类斯特林数+NTT)

    传送门 首先,因为在\(j>i\)的时候有\(S(i,j)=0\),所以原式可以写成\[Ans=\sum_{i=0}^n\sum_{j=0}^nS(i,j)\times 2^j\times j! ...

随机推荐

  1. 番外篇:因为一个固态导致的——系统重装与JAVA软件环境下载安装配置

    第一步:拆机改装 最近想换个固态硬盘提提速度,就买了个,然后拧下后盖螺丝,将键盘盖拿下,中间有两个根线连着把扣打开就可以了,将新的固态硬盘装到原本的机械硬盘的地方,又买了个光驱托盘改装位将光驱位装上了 ...

  2. bitmap过大无法显示图片的问题 - z

    public Bitmap ratio(Bitmap image, float pixelW, float pixelH) {Bitmap bitmap = null;try {ByteArrayOu ...

  3. 20155316 《网络对抗》Exp8 Web基础

    实验内容 实验1:Web前端HTML 能正常安装.启停Apache.理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML. 1.开启Apache服务 思路:使用service ...

  4. 【WPF】数据验证

    原文:[WPF]数据验证 引言      数据验证在任何用户界面程序中都是不可缺少的一部分.在WPF中,数据验证更是和绑定紧紧联系在一起,下面简单介绍MVVM模式下常用的几种验证方式. 错误信息显示 ...

  5. scala学习——(1)scala基础(上)

    scala> val x = 1 x: Int = 1 一.值与变量 值(val):赋值后不可变 val值名称:类型 = XXX 变量(var):赋值后可以改变  var变量名称:类型 = XX ...

  6. [CF1039E]Summer Oenothera Exhibition[根号分治+lct]

    题意 给一个长度为 \(n\) 的序列, \(q\) 次询问,次给一个 \(k_i\) ,问最少将序列划分成多少次,满足每一段的极差不超过\(w−k_i\). \(1 \leq n, q \leq 1 ...

  7. PowerBI开发 第六章:数据网管

    Power BI的本地数据网管(On-Premises Data Gateway)是运行在组织内部的软件,用于管控外部用户访问内部(on-premises)数据的权限.PowerBI的网管像是一个尽职 ...

  8. 详解C#7.0新特性

    1. out 变量(out variables) 以前我们使用out变量必须在使用前进行声明,C# 7.0 给我们提供了一种更简洁的语法 “使用时进行内联声明” .如下所示: 1 var input ...

  9. Qt QpushButton 实现长按下功能

    做项目需要一个按钮具备长时间按下的功能,才发现Qt原始的按钮是没有这个功能,不过Qt的原生按钮是存在按下和释放信号的,有了这两个信号,再来实现按钮长时间被按下,这就简单了,看下动画演示. 录成GIF效 ...

  10. Scrum Meeting NO.1

    Scrum Meeting No.1 1.会议内容 不出所料地,组员们都在忙着写编译.编译大作业的进度已经接近尾声,码农们已经磨刀霍霍向软工-- 在上一周,bugphobia和我们组决定共同使用一套后 ...