bzoj5093图的价值:多项式,斯特林数(二项式反演)
Description
“简单无向图”是指无重边、无自环的无向图(不一定连通)。 一个带标号的图的价值定义为每个点度数的k次方的和。 给定n和k,请计算所有n个点的带标号的简单无向图的价值之和。
因为答案很大,请对998244353取模输出。$n \le 10^9,k \le 200000$
化学学考时含义推式子+手动打表找规律得到了一个$O(nlogn)$的式子开心的很我以为我要AC了回来看数据范围就升天了。
问NC大神这题用到了什么:斯特林数/伯努利数。然后就自闭了学了一天的知识点还去做了点伯努利数的别的题。
然而最后没想到伯努利数的做法,是用第二类斯特林数解决的。
先列出来答案的式子,分别考虑每个点的贡献:
$ans=2^{\frac{(n-1)(n-2)}{2}} \times n \times \sum\limits_{i=0}^{n} C_{n-1}^i \times i^k$
就是首先在n个点里选出你当前考虑贡献答案的是哪个点,然后在剩余的n-1个点的子图里联通情况随意就是$2^{\frac{(n-1)(n-2)}{2}}$
然后从n-1个点里选出i个与当前贡献答案的点连边,选法是组合数,贡献的价值是$i^k$。
可以发现,这里有个求自然数幂和乘个组合数的形式,而自然数幂和的范围很大不能直接求解。
动用学过的(和刚学的)所有数学知识点看有什么能把幂拆成可以接受的形式。
1,伯努利数:$\sum\limits_{i=1}^{n} i^m = \frac{\sum\limits_{i=1}^{m} B_i \times C_{m+1}^{i} \times n^{m+1-i} }{m+1}$
这不妨是个好主意,但是这道题里要求的是自然数幂乘组合数后再求和,并不能直接适用,所以至少我现在还不会做。
等会上网学习一下再来fix这里。
学习完了,网上并没有这样的做法,但是伯努利数和第二类斯特林数可以互相转化。。。
对这题并没有什么帮助。。。
2,第二类斯特林数:$x^n=\sum\limits_{i=0}^{n} \left \{ ^n_k \right \} \times \frac{x!}{(x-i)!}$
这样的话虽然不能直接求和,但是好歹可以把难以解决的高次幂转化为经常处理的阶乘什么的了。
首先说说关于斯特林数怎么求:先弄明白含义,第二类斯特林数$\left \{ ^n_k \right \}$表示把n个元素放进k个无标号非空集合的方案数。
然后我们再弄几个类似的定义:设f(n,k)表示把n个元素放进k个有编号非空集合的方案数,g(n,k)表示n个元素放进k个有标号可空集合的方案数。
对于是否有编号的问题,其实就是多了个内部顺序,所以$\left \{ ^n_k \right \}=\frac{f(n,k)}{k!}$
然后g其实是可以直接求解的:$g(n,k)=k^n$
然后至于f和g之间的关系,我们可以通过枚举它具体有几个集合是空的,得到$g(n,k)=\sum\limits_{i=0}^{k} C_k^i \times f(n,i)$
就是选出到底哪几个不是空的,在这些非空的里面进行分配。
然后发现这个形式就是二项式反演的基本形式,所以反演它:$f(n,k)=\sum\limits_{i=0}^{k} (-1)^{k-i} \times C_k^i \times g(n,i)$
这样我们就能得到f,进而求解出第二类斯特林数。
总的式子就是$\left \{ ^n_k \right \}=\sum\limits_{i=0}^{k} \frac{(-1)^{k-i} \times i^k}{(k-i)! \times i!}$
这样的话单点求第二类斯特林数就是$O(n)$的了。而上式是个卷积形式,所以求一行第二类斯特林数就可以用NTT在$O(nlogn)$之内解决。
回到这道题来,求解斯特林数的复杂度是$O(klogk)$可以接受,那么现在答案的式子是什么?
$ans=2^{\frac{(n-1)(n-2)}{2}} \times n \times \sum\limits_{i=0}^{n} C_{n-1}^{i} \sum\limits_{j=0}^{k} \left \{ ^k_j \right \} \times \frac{i!}{(i-j)!}$
把各种组合数拆一拆放在一起消一消,得到:$ans=2^{\frac{(n-1)(n-2)}{2}} \times n! \times \sum\limits_{i=0}^{n} \sum\limits_{j=0}^{k} \left \{ ^k_j \right \} \times \frac{1}{(i-j)! \times (n-i-1)!}$
换一下ij的枚举顺序,发现最后那个分母上两个阶乘的底之和是一个与i无关的定值,上下都乘一个$(n-j-1)!$合成一个组合数。它等于$\frac{C_{n-j-1}^{i-j}}{(n-j-1)!}$
然后再套上外面那个求和。。。一行组合数求和得到的是2的次幂,所以这个和式就可以扔掉了得到下面形式:
$ans=2^{\frac{(n-1)(n-2)}{2}} \times n! \times \sum\limits_{j=0}^{k} \frac{\left \{ ^k_j \right \} \times 2^{n-j-1}}{(n-j-1)!} $
现在的瓶颈就在于式子中的两个阶乘不能在合理复杂度内求出。
然而它们一个在分子上,一个在分母上,而且它们底数的差值在k范围内。。。
抵消啊!就剩下一个下降幂了!
所以最后可做的式子就是$2^{\frac{(n-1)(n-2)}{2}} \sum\limits_{j=0}^{k} \left \{ ^k_j \right \} \times 2^{n-j-1} \times n^{\underline{j+1}}$
#include<cstdio>
#define int long long
#define mod 998244353
#define S 555555
int n,k,a[S],s[S],len=,fac[S],inv[S],rev[S],dw[S],ans;
int pow(int b,int t,int a=){for(;t;t>>=,b=b*b%mod)if(t&)a=a*b%mod;return a;}
void NTT(int *a,int opt){
for(int i=;i<len;++i)if(rev[i]>i)a[i]^=a[rev[i]]^=a[i]^=a[rev[i]];
for(int mid=;mid<len;mid<<=)
for(int i=,t=pow(,(mod-)//mid*opt+mod-);i<len;i+=mid<<)
for(int j=i,x,y,w=;j<mid+i;++j,w=w*t%mod)
x=a[j],y=a[j+mid]*w%mod,a[j]=(x+y)%mod,a[j+mid]=(x-y+mod)%mod;
if(opt==-)for(int i=,iv=pow(len,mod-);i<len;++i)a[i]=a[i]*iv%mod;
}
signed main(){
scanf("%lld%lld",&n,&k);fac[]=dw[]=;
while(len<=k<<)len<<=;
for(int i=;i<len;++i)rev[i]=rev[i>>]>>|(i&?len>>:);
for(int i=;i<=k;++i)fac[i]=fac[i-]*i%mod;
inv[k]=pow(fac[k],mod-);
for(int i=k-;~i;--i)inv[i]=inv[i+]*(i+)%mod;
for(int i=;i<=k;++i)a[i]=pow(i,k)*inv[i]%mod,s[i]=(i&?mod-:)*inv[i]%mod;
NTT(a,);NTT(s,);for(int i=;i<len;++i)s[i]=s[i]*a[i]%mod;NTT(s,-);
for(int i=;i<=k+;++i)dw[i]=dw[i-]*(n+-i)%mod;
for(int i=;i<=k;++i)ans=(ans+dw[i+]*pow(,n-i-)%mod*s[i])%mod;
printf("%lld\n",ans*pow(,(n-)*(n-)/)%mod);
}
真累啊。。。
bzoj5093图的价值:多项式,斯特林数(二项式反演)的更多相关文章
- 【bzoj5093】 [Lydsy1711月赛]图的价值 组合数+斯特林数+NTT
Description "简单无向图"是指无重边.无自环的无向图(不一定连通). 一个带标号的图的价值定义为每个点度数的k次方的和. 给定n和k,请计算所有n个点的带标号的简单无向 ...
- BZOJ.5093.[Lydsy1711月赛]图的价值(NTT 斯特林数)
题目链接 对于单独一个点,我们枚举它的度数(有多少条边)来计算它的贡献:\[\sum_{i=0}^{n-1}i^kC_{n-1}^i2^{\frac{(n-2)(n-1)}{2}}\] 每个点是一样的 ...
- 【题解】BZOJ5093图的价值(二项式+NTT)
[题解]BZOJ5093图的价值(二项式+NTT) 今天才做这道题,是我太弱了 强烈吐槽c++这种垃圾语言tmd数组越界不re反倒去别的数组里搞事情我只想说QAQ 推了一张A4纸的式子 考虑每个点的度 ...
- [CF932E]Team Work & [BZOJ5093]图的价值
CF题面 题意:求\(\sum_{i=0}^{n}\binom{n}{i}i^k\) \(n\le10^9,k\le5000\) 模\(10^9+7\) BZOJ题面 题意:求\(n*2^{\frac ...
- BZOJ5093图的价值(斯特林数)
题目描述 “简单无向图”是指无重边.无自环的无向图(不一定连通). 一个带标号的图的价值定义为每个点度数的k次方的和. 给定n和k,请计算所有n个点的带标号的简单无向图的价值之和. 因为答案很大,请对 ...
- BZOJ5093 图的价值(NTT+斯特林数)
显然每个点会提供相同的贡献.于是现在只考虑1号点的贡献.若其度数为i,则在2~n号点选i个连上,剩下的边随便连,这样可以算出答案为 这个式子可以O(n)计算.发现k比较小,于是考虑如何将这个式子化为与 ...
- bzoj5093:图的价值(第二类斯特林数+NTT)
传送门 首先,题目所求为\[n\times 2^{C_{n-1}^2}\sum_{i=0}^{n-1}C_{n-1}^ii^k\] 即对于每个点\(i\),枚举它的度数,然后计算方案.因为有\(n\) ...
- BZOJ5093 图的价值——推式子+第二类斯特林数
原题链接 题解 题目等价于求这个式子 \[ans=n2^{\frac{(n-1)(n-2)}{2}}\sum\limits_{i=0}^{n-1}\binom{n-1}{i}i^k\] 有这么一个式子 ...
- [BZOJ5093]图的价值(NTT+第二类Stirling数)
5093: [Lydsy1711月赛]图的价值 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 250 Solved: 130[Submit][Sta ...
随机推荐
- python中bitmap的参数
Tkinter Bitmaps: 你会使用这个属性显示一个位图.有以下类型的可用位图. 你会使用这个属性显示一个位图.有以下类型的可用位图.: "error" "gray ...
- salt
更新于 3.25 23:16 salt简介 SaltStack是一个服务器基础架构集中化管理平台,具备配置管理.远程执行.监控等功能,基于Python语言实现,结合轻量级消息队列(ZeroMQ)与Py ...
- python爬虫--代理.让你的ip在坚挺一会!!
代理 代理简述 代理服务器:实现请求转发,从而可以实现更换请求的ip地址 在requests中如何将请求的ip进行更换 代理的匿名度: 透明:服务器知道你使用了代理并且知道你的真实ip 匿名:服务器知 ...
- Vue ---- 组价 组件化 子传父 父传子
目录 补充js的for循环: 组件 1.组件的分类: 2.组件的特点 3.创建局部组件 4.全局组件 二.组件化 一.组件传参父传子 二.组件传参:子传父 补充js的for循环: // for in遍 ...
- 如何使用Jmeter进行压力测试
Jmeter做压力测试的操作:Jmeter不仅可以做接口测试,还可以做压力测试,下面介绍介绍如何jmeter进行简单地压力测试.具体步骤如下: 第一步:添加请求,这里不介绍具体步骤,详见(https: ...
- webpack前端简单配置
每次用webpack创建项目时,总是要安装一堆包,还要配置一系列文件解析规则,webpack打包规则等,烦不胜烦.网上找的很多webpack配置里面很多里面的配置或者引入包都是被弃用的,因此自己总结了 ...
- 常见的web安全问题总结
we安全对于web前端从事人员也是一个特别重要的一个知识点,也是面试的时候,面试官经常问的安全前端问题.掌握一些web安全知识,提供安全防范意识,今天就会从几个方面说起前端web攻击和防御的常用手段 ...
- MySql全文检索使用详解
实际项目中经常会有一个字段存储多个值用逗号分隔的场景,当分开查询的时候,使用模糊查询会非常影响效率.mysql提供了全文检索函数可以有效解决这一问题: 1.数据结构 ID CODE MSG 1 111 ...
- python 多线程编程之_thread模块
参考书籍:python核心编程 _thread模块除了可以派生线程外,还提供了基本的同步数据结构,又称为锁对象(lock object,也叫原语锁.简单锁.互斥锁.互斥和二进制信号量). 下面是常用的 ...
- dotnetcore执行shell脚本
我们可以使有dotnetcore跨平台的特性,优雅的实现在dotnetcore执行shell (bash). 代码如下: using System; using System.Collections ...