题目链接

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. 详解分布式应用程序协调服务Zookeeper

    主从结构:HDFS.Yarn.HBase.storm.spark.zookeeper都存在单点故障问题 hadoop1.x没有解决方案 hadoop2.x利用zookeeper实现HA zookeep ...

  2. 大数据入门第十七天——storm上游数据源 之kafka详解(二)常用命令

    一.kafka常用命令 1.创建topic bin/kafka-topics. --replication-factor --zookeeper mini1: // 如果配置了PATH可以省略相关命令 ...

  3. 网络对抗技术 2017-2018-2 20155215 Exp9 Web安全基础

    1.实践过程 前期准备:WebGoat WebGoat分为简单版和开发板,简单版是个Java的Jar包,只需要有Java环境即可,我们在命令行里执行java -jar webgoat-containe ...

  4. 网络对抗技术 2017-2018-2 20152515 Exp2 后门原理与实践

    1.实验内容 (1)使用netcat获取主机操作Shell,cron启动 (0.5分) 关于netcat:是一个底层工具,进行基本的TCP UDP数据收发.常被与其他工具结合使用,起到后门的作用. 相 ...

  5. 20155318 《网络攻防》Exp5 MSF基础应用

    20155318 <网络攻防>Exp5 MSF基础应用 基础问题 用自己的话解释什么是exploit,payload,encode? exploit就相当于是载具,将真正要负责攻击的代码传 ...

  6. Jenkins控制台输出乱码

    一.问题详情 jenkins构建mav任务,在控制台显示乱码: 二.原因分析 1. 查看系统编码和tomcat的编码都正常 # grep encoding /usr/local/tomcat/conf ...

  7. TLV5620参考电压的问题

    1. TLV5620参考电压的,上面红线的VID的意思应该是引脚(REFA-REFD)输入的电压值(3.3V),下面的应该是实际参考值,根据实际测试VID=3.3V的时候,Vref=2.2V,至于为什 ...

  8. SSIS 更新变量

    在Package中声明一个variable,在package运行的过程中,SSIS如何update Variable? 第一种方法:使用 Script Task 来更新Variable的值 1,创建一 ...

  9. 设计模式 笔记 观察者模式 Observer

    //---------------------------15/04/27---------------------------- //Observer 观察者模式----对象行为型模式 /* 1:意 ...

  10. wordpress 5.1 后台拿shell

    闲着没事搭建了一套最新版wordpress 5.1,本身wordpress后台安全防御是比较差的,想尝试下后台是否可以拿shell. 再上传插件的地方可以直接上传php文件,并且该文件可以执行: sh ...