BZOJ5093 图的价值——推式子+第二类斯特林数
题解
题目等价于求这个式子
\]
有这么一个式子
k\\
j
\end{Bmatrix}j!\binom{i}{j}\]
代入可得
k\\
j
\end{Bmatrix}j!\binom{i}{j}\]
交换枚举顺序
k\\
j
\end{Bmatrix}j!\sum\limits_{i=j}^{n-1}\binom{n-1}{i}\binom{i}{j}\]
考虑到后面那个和号的组合意义为先在\(n-1\)个数中确定\(j\)个,剩下的可选可不选,即
k\\
j
\end{Bmatrix}j!\binom{n-1}{j}2^{n-1-j}
\]
k\\
j
\end{Bmatrix}\frac{(n-1)!}{(n-1-j)!}2^{n-1-j}\]
本题的\(n\)可能高达\(10^9\),但是发现当\(j>k\)时\(\begin{Bmatrix}
k\\
j
\end{Bmatrix}\)为\(0\),改一下求和上界
k\\
j
\end{Bmatrix}\frac{(n-1)!}{(n-1-j)!}2^{n-1-j}\]
第二类斯特林数可以直接卷积出来,总复杂度\(O(nlogn)\)
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <string>
#include <vector>
#include <cmath>
#include <ctime>
#include <queue>
#include <map>
#include <set>
using namespace std;
#define ull unsigned long long
#define pii pair<int, int>
#define uint unsigned int
#define mii map<int, int>
#define lbd lower_bound
#define ubd upper_bound
#define INF 0x3f3f3f3f
#define IINF 0x3f3f3f3f3f3f3f3fLL
#define DEF 0x8f8f8f8f
#define DDEF 0x8f8f8f8f8f8f8f8fLL
#define vi vector<int>
#define ll long long
#define mp make_pair
#define pb push_back
#define re register
#define il inline
#define N 1000000
#define MOD 998244353
int n, k;
int a[N+5], b[N+5], S[N+5], fac[N+5], facinv[N+5];
int fpow(int x, int p) {
int ret = 1;
while(p) {
if(p&1) ret = 1LL*ret*x%MOD;
x = 1LL*x*x%MOD;
p >>= 1;
}
return ret;
}
void bitReverse(int *s, int bit, int len) {
static int tmp[4*N+5];
tmp[0] = 0;
for(int i = 1; i < len; ++i) {
tmp[i] = (tmp[i>>1]>>1)|((i&1)<<(bit-1));
if(i < tmp[i]) swap(s[i], s[tmp[i]]);
}
}
void DFT(int *s, int bit, int len, int flag) {
bitReverse(s, bit, len);
for(int l = 1; l <= len; l <<= 1) {
int mid = l>>1, t = fpow(3, (MOD-1)/l);
if(flag) t = fpow(t, MOD-2);
for(int *p = s; p != s+len; p += l) {
int w = 1, x, y;
for(int i = 0; i < mid; ++i) {
x = p[i], y = 1LL*w*p[i+mid]%MOD;
p[i] = (x+y)%MOD;
p[i+mid] = (x-y)%MOD;
w = 1LL*w*t%MOD;
}
}
}
if(flag) {
int invlen = fpow(len, MOD-2);
for(int i = 0; i < len; ++i) s[i] = 1LL*s[i]*invlen%MOD;
}
}
int main() {
scanf("%d%d", &n, &k);
if(n == 1) {
printf("0\n");
return 0;
}
fac[0] = 1;
for(int i = 1; i <= k; ++i) fac[i] = 1LL*fac[i-1]*i%MOD;
facinv[k] = fpow(fac[k], MOD-2);
for(int i = k; i >= 1; --i) facinv[i-1] = 1LL*facinv[i]*i%MOD;
for(int i = 0; i <= k; ++i) {
a[i] = facinv[i];
if(i&1) a[i] *= -1;
b[i] = 1LL*fpow(i, k)*facinv[i]%MOD;
}
int bit = 0, len;
while((1<<bit) < 2*k+2) bit++;
len = (1<<bit);
DFT(a, bit, len, 0), DFT(b, bit, len, 0);
for(int i = 0; i < len; ++i) S[i] = 1LL*a[i]*b[i]%MOD;
DFT(S, bit, len, 1);
int ans = 0, lim = min(n-1, k), x = 1, y = fpow(2, n-1), t = fpow(2, MOD-2);
for(int i = 0; i <= lim; ++i) {
ans = (ans+1LL*S[i]*x%MOD*y%MOD)%MOD;
x = 1LL*x*(n-1-i)%MOD, y = 1LL*y*t%MOD;
}
if(n&1) ans = 1LL*n*fpow(fpow(2, (n-1)/2), n-2)%MOD*ans%MOD;
else ans = 1LL*n*fpow(fpow(2, (n-2)/2), n-1)%MOD*ans%MOD;
ans = (ans+MOD)%MOD;
printf("%d\n", ans);
return 0;
}
BZOJ5093 图的价值——推式子+第二类斯特林数的更多相关文章
- 【bzoj5093】[Lydsy1711月赛]图的价值(NTT+第二类斯特林数)
题意: 给定\(n\)个点,一个图的价值定义为所有点的度数的\(k\)次方之和. 现在计算所有\(n\)个点的简单无向图的价值之和. 思路: 将式子列出来: \[ \sum_{i=1}^n\sum_{ ...
- Codeforces 1528F - AmShZ Farm(转化+NTT+推式子+第二类斯特林数)
Codeforces 题目传送门 & 洛谷题目传送门 神仙题,只不过感觉有点强行二合一(?). 首先考虑什么样的数组 \(a\) 符合条件,我们考虑一个贪心的思想,我们从前到后遍历,对于每一个 ...
- 【BZOJ5093】图的价值(第二类斯特林数,组合数学,NTT)
[BZOJ5093]图的价值(第二类斯特林数,组合数学,NTT) 题面 BZOJ 题解 单独考虑每一个点的贡献: 因为不知道它连了几条边,所以枚举一下 \[\sum_{i=0}^{n-1}C_{n-1 ...
- BZOJ5093 [Lydsy1711月赛]图的价值 【第二类斯特林数 + NTT】
题目链接 BZOJ5093 题解 点之间是没有区别的,所以我们可以计算出一个点的所有贡献,然后乘上\(n\) 一个点可能向剩余的\(n - 1\)个点连边,那么就有 \[ans = 2^{{n - 1 ...
- bzoj5093:图的价值(第二类斯特林数+NTT)
传送门 首先,题目所求为\[n\times 2^{C_{n-1}^2}\sum_{i=0}^{n-1}C_{n-1}^ii^k\] 即对于每个点\(i\),枚举它的度数,然后计算方案.因为有\(n\) ...
- BZOJ 5093: [Lydsy1711月赛]图的价值 第二类斯特林数+NTT
定义有向图的价值为图中每一个点的度数的 \(k\) 次方之和. 求:对于 \(n\) 个点的无向图所有可能情况的图的价值之和. 遇到这种题,八成是每个点单独算贡献,然后累加起来. 我们可以枚举一个点的 ...
- bzoj 5093 [Lydsy1711月赛]图的价值 NTT+第二类斯特林数
[Lydsy1711月赛]图的价值 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 245 Solved: 128[Submit][Status][D ...
- bzoj 5093 图的价值 —— 第二类斯特林数+NTT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5093 每个点都是等价的,从点的贡献来看,得到式子: \( ans = n * \sum\li ...
- CF932E Team Work(第二类斯特林数)
传送门:CF原网 洛谷 题意:给定 $n,k$,求 $\sum\limits^n_{i=1}\dbinom{n}{i}i^k\bmod(10^9+7)$. $1\le n\le 10^9,1\le k ...
随机推荐
- 通过JS动态追加标签,以父评论子评论为例
以下代码前后端交互以Django模板语法为例 先来以伪代码来示意用法: HTML部分: JS动态插入部分代码: 运行之后我们来浏览器看检查打印的内容: 看插入前后打印结果我们可以得知 $title[0 ...
- studio git创建与删除标签(Tag)
代码托管平台 码云 git工具 Git git上的标签一般是用于标记版本, 当发布新版本后,便将该版本的代码打上Tag,用以区别及管理 使用标签前需要将代码提交到马云上 以上是提交git. 创建并提交 ...
- 【AtCoder】AGC003
AGC编号越小越水???? AGC003 A - Wanna go back home 相对方向要么一起有要么一起没有 #include <bits/stdc++.h> #define f ...
- HDU 3047 带权并查集 入门题
Zjnu Stadium 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=3047 Problem Description In 12th Zhejian ...
- Snoopy.class.php介绍
Snoopy是一个开源的模拟抓取工具,找到一个不错的介绍网页 记录一下: php开源采集类Snoopy.class.php功能使用介绍与下载地址 Snoopy.class.php使用手册 还有一个介绍 ...
- celery(芹菜) 异步任务 定时任务 周期任务
什么是celery Celery是一个简单.灵活且可靠的,处理大量消息的分布式系统 专注于实时处理的异步任务队列 同时也支持任务调度 celery架构 celery的架构由三部分组成,消息中间件(me ...
- outlook邮箱备份
- CentOS7安装配置redis5集群
一.服务器准备 本文准备了3台服务器 , 分别是 172.18.0.231 172.18.0.232 172.18.0.233 每台运行2个redis实例, 端口分别为7000 7001 ,即总共6个 ...
- Spring实战(三)Spring中装配Bean的三种方式---XML、JavaConfig、AutoWire
创建应用对象之间协作关系的行为称为装配(wiring),这也是依赖注入的本质. Spring容器负责创建应用程序中的bean并通过DI来协调这些对象之间的关系,而开发者需要告诉Spring需要创建哪些 ...
- django inclusion用法
概述: inclusion主要的是生成html标签, 返回的是一个字典,大分部跟simple_tag类似, simple_tag可返回任意类型的值 定义inclusion from django im ...