【bzoj5093】 [Lydsy1711月赛]图的价值 组合数+斯特林数+NTT
Description
“简单无向图”是指无重边、无自环的无向图(不一定连通)。
一个带标号的图的价值定义为每个点度数的k次方的和。
给定n和k,请计算所有n个点的带标号的简单无向图的价值之和。
因为答案很大,请对998244353取模输出。
Input
第一行包含两个正整数n,k(1<=n<=10^9,1<=k<=200000)。
Output
输出一行一个整数,即答案对998244353取模的结果。
Sample Input
6 5
Sample Output
67584000
Sol
首先我们发现,图中每个点的贡献是独立的,而且每个点都一样,所以我们只计算1号点的贡献,之后乘n即可。除了1号点,其他的点可以任意连边,而1号点的出边有n-1条,我们可以枚举选择几条,于是有:
\(ans=n*2^{\frac{(n-1)(n-2)}{2}}*\sum_{i=0}^{n-1}C_n^i*i^k\)
前面一部分显然能够直接算,然后我们把n--,考虑后面一部分:
有这样一个定理:\(n^k=\sum_{i=1}^{n}A_n^iS_k^i\),证明的话,可以用组合意义证明,就是考虑把k个球放到n个带标号的箱子的方案数,显然两边都可以描述这样的方案数。
所以\(\sum_{i=0}^{n}C_n^i*i^k=\sum_{i=0}^{n}C_n^i*\sum_{j=0}^{i}A_i^jS_k^j\)
\(=\sum_{i=0}^{n}C_n^i*\sum_{j=0}^iC^j_ij!S_k^j\)
\(=\sum_{j=0}^{n}j!S_k^j\sum_{i=0}^nC_n^iC_i^j\)
这里因为组合数的限制,我们可以把求和上限取到n,不会影响答案,但是这样便于进一步的推导。
后面那个式子等同于\(C_n^j*2^{n-j}\),因为从n个中选i个,再从i中选j个,而且i是从1~n循环的,这等同于我们直接枚举j,然后剩下的随意选与不选的方案数,也就是上面的式子了。
这样原式\(=\sum_{j=0}^nj!S_k^jC_n^j*2^{n-j}\)
斯特林数因为下底固定,所以可以用NTT计算,然后这个题就能在\(O(nlogn)\)时间内解决。
要注意\(C_n^j\)因为下底过大无法预处理,所以只能按步根据定义式计算。
Code
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll n,fac[200005],ifa[200005],inv[200005],a[524289],b[524289],C=1,P=998244353,w,wn,t,ans;int K,len,i,j,k;
ll ksm(ll a,ll b){ll res=1;for(;b;b>>=1,a=a*a%P) if(b&1) res=res*a%P;return res;}
void ntt(ll *a,int n,int op)
{
for(i=k=0;i<n;i++){if(i>k) swap(a[i],a[k]);for(j=(n>>1);(k^=j)<j;j>>=1);}
for(k=2,wn=ksm(3,op==1?(P-1)/k:P-1-(P-1)/k);k<=n;k<<=1,wn=ksm(3,op==1?(P-1)/k:P-1-(P-1)/k))
for(i=0,w=1;i<n;i+=k,w=1) for(j=0;j<(k>>1);j++,w=w*wn%P)
t=a[i+j+(k>>1)]*w%P,a[i+j+(k>>1)]=(a[i+j]-t+P)%P,a[i+j]=(a[i+j]+t)%P;
if(op==-1) for(t=ksm(n,P-2),i=0;i<n;i++) a[i]=a[i]*t%P;
}
int main()
{
scanf("%lld%d",&n,&K);n--;
for(len=1;len<=(K*2);len<<=1);
inv[0]=inv[1]=fac[0]=fac[1]=ifa[0]=ifa[1]=1;
for(int i=2;i<=K;i++) inv[i]=P-(P/i)*inv[P%i]%P,fac[i]=fac[i-1]*i%P,ifa[i]=inv[i]*ifa[i-1]%P;
for(int i=0;i<=K;i++) a[i]=(i&1?-1:1)*ifa[i],b[i]=ksm(i,K)*ifa[i]%P;
ntt(a,len,1);ntt(b,len,1);
for(int i=0;i<len;i++) a[i]=a[i]*b[i]%P;ntt(a,len,-1);
for(int i=0;i<=n&&i<=K;i++) ans=(ans+a[i]*fac[i]%P*C%P*ksm(2,n-i)%P)%P,C=C*(n-i)%P*inv[i+1]%P;
ans=ans*(n+1)%P*ksm(2,n*(n-1)/2)%P;printf("%lld\n",(ans+P)%P);
}
【bzoj5093】 [Lydsy1711月赛]图的价值 组合数+斯特林数+NTT的更多相关文章
- BZOJ5093 [Lydsy1711月赛]图的价值 【第二类斯特林数 + NTT】
题目链接 BZOJ5093 题解 点之间是没有区别的,所以我们可以计算出一个点的所有贡献,然后乘上\(n\) 一个点可能向剩余的\(n - 1\)个点连边,那么就有 \[ans = 2^{{n - 1 ...
- bzoj5093: [Lydsy1711月赛]图的价值
不难想到考虑每个点的贡献,ans=n*sigema(1~n)i C(n-1,i)*(2^C(n-1,2))*i^k 直接套第二类斯特林拆柿子即可.提示:sigema(1~n)i C(n,i)*C(i, ...
- bzoj 5093 [Lydsy1711月赛]图的价值 NTT+第二类斯特林数
[Lydsy1711月赛]图的价值 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 245 Solved: 128[Submit][Status][D ...
- 【bzoj5093】[Lydsy1711月赛]图的价值(NTT+第二类斯特林数)
题意: 给定\(n\)个点,一个图的价值定义为所有点的度数的\(k\)次方之和. 现在计算所有\(n\)个点的简单无向图的价值之和. 思路: 将式子列出来: \[ \sum_{i=1}^n\sum_{ ...
- bzoj5093:[Lydsy1711月赛]图的价值
题目 首先考虑到这是一张有标号的图,每一个点的地位是相等的,因此我们只需要求出一个点的价值和乘上\(n\)就好了 考虑一个点有多少种情况下度数为\(i\) 显然我们可以让除了这个点的剩下的\(n-1\ ...
- BZOJ 5093: [Lydsy1711月赛]图的价值 第二类斯特林数+NTT
定义有向图的价值为图中每一个点的度数的 \(k\) 次方之和. 求:对于 \(n\) 个点的无向图所有可能情况的图的价值之和. 遇到这种题,八成是每个点单独算贡献,然后累加起来. 我们可以枚举一个点的 ...
- bzoj 5093 [Lydsy1711月赛]图的价值——第二类斯特林数
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5093 不要见到组合数就拆! 枚举每个点的度数,则答案为 \( n*\sum\limits_{ ...
- BZOJ.5093.[Lydsy1711月赛]图的价值(NTT 斯特林数)
题目链接 对于单独一个点,我们枚举它的度数(有多少条边)来计算它的贡献:\[\sum_{i=0}^{n-1}i^kC_{n-1}^i2^{\frac{(n-2)(n-1)}{2}}\] 每个点是一样的 ...
- BZOJ 5093: [Lydsy1711月赛]图的价值
第二类斯特林数模版题 需要一些组合数的小$ trick$ upd:这里更新了本题巧妙的$ O(k)$做法,虽然常数很大就是了 传送门:here 题意:求所有$ n$个节点的无重边自环图的价值和,定义一 ...
随机推荐
- Unable to correct problems, you have held broken package
其实这篇接着上文(一),主要是解决samba安装的问题,中间又是一路曲折.不过这个问题也算是比较典型,有必要记录一下. #apt-get install smb* 安装失败.其实顺利的话,直接一条这样 ...
- JavaScript高级程序设计学习
1.变量 变量使用var操作符定义,var message,定义一个message变量,可用来保存任何类型的变量.未经初始化的变量值为undifided: 如果没变量没有被var定义,那么被执行后会成 ...
- Texture Filter
[Texture Filter] 我们的纹理是要贴到三维图形表面的,而三维图形上的pixel中心和纹理上的texel中心并不一至(pixel不一定对应texture上的采样中心texel),大小也不一 ...
- MobileSubstrate
[MobileSubstrate] Cydia Substrate (formerly called MobileSubstrate) is the de facto framework that a ...
- 仿函数(二、stl中常用仿函数)
提到C++ STL,首先被人想到的是它的三大组件:Containers, Iterators, Algorithms,即容器,迭代器和算法.容器为用户提供了常用的数据结构,算法大多是独立于容器的常用的 ...
- 面试中的C++常见问题
1.在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”? 答:首先,extern是C/C++语言中表明函数和全局变量作用范围的关键字,该关键字告诉编译器,其声明的函数和变量可 ...
- 2014蓝桥杯B组初赛试题《六角填数》
题目描述: 如图[1.png]所示六角形中,填入1~12的数字. 使得每条直线上的数字之和都相同. 图中,已经替你填好了3个数字,请你计算星号位置所代表的数字是多少? 请通过浏览器提交 ...
- SQL SERVER FOR XML PATH合并字符串
两种方式,效率立竿见影 ------------------------------------------------ SET STATISTICS TIME ON DECLARE @OrderSt ...
- Hadoop 使用Combiner提高Map/Reduce程序效率
众所周知,Hadoop框架使用Mapper将数据处理成一个<key,value>键值对,再网络节点间对其进行整理(shuffle),然后使用Reducer处理数据并进行最终输出. 在上述过 ...
- 34.UCASE() LCASE() 函数
UCASE() 函数 UCASE 函数把字段的值转换为大写. SQL UCASE() 语法 SELECT UCASE(column_name) FROM table_name SQL UCASE() ...