5093: [Lydsy1711月赛]图的价值

Time Limit: 30 Sec  Memory Limit: 256 MB
Submit: 250  Solved: 130
[Submit][Status][Discuss]

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

HINT

Source

[Submit][Status][Discuss]

挺喜欢的一道题,首先从每个点的贡献的角度考虑并列出式子,然后通过Stirling数将幂数转化为下降幂,再交换求和枚举顺序并用组合数公式化简,最后用Stirling数组合意义公式转化成可以FFT的形式,直接套用NTT即可。

具体参考https://blog.csdn.net/cdsszjj/article/details/79080229

首先第一步列出式子不难想到,然后观察发现这是一个n项求和,显然不能直接做,第二步引入Stirling数,尽量使关于n的项消去。通过把与n有关的项放在等式最后并变形,成功使枚举上界从n变为min(n,k),大大降低了时间复杂度。但是递推求$O(k)$的Stirling数仍然无法承受,但第二类Stirling数有恰好符合FFT形式的公式,我们另$a[i]=\frac{(-1)^i}{i!}$,$b[i]=\frac{(m-i)^n}{(m-i)!}$,结果就是最基本的FFT形式:$S[n]=\sum_{i=0}^{n}a[i]b[n-i]$。这里将NTT封装起来感觉清晰了不少。

扯几句题外话:

1.设$f(n)=\sum\limits_{i=1}^n(i,n)$,$g(n)=\sum\limits_{d|n}f(d)$,化简$g(n)$。

$$f(n)=\sum\limits_{i=1}^n\sum\limits_{d|i\ d|n}\phi(d)=\sum\limits_{d|n}\phi(d)\frac{n}{d}$$到这里我们可以不断带入化简,但是我们其实可以发现:$$f(n)=\phi*id$$$$g(n)=I*f=I*(\phi*id)=(I*\phi)*id=id*id$$所以$$g(n)=\sum\limits_{d|n}d\frac{n}{d}$$

2.几个组合数化简:$$\sum_{i=0}^nC_n^iC_i^k=C_n^k\sum_{i=k}^nC_{n-k}^{i-k}$$$$\sum_{i=0}^aC_a^iC_b^{k-i}=C_{a+b}^k$$$$\sum_{i=0}^aC_a^iC_a^i=C_{2a}^i$$$$\sum_{i=0}^aC_a^{a-i}C_b^{i+k}=C_{a+b}^{a+k}$$

 #include<cstdio>
#include<algorithm>
#define rep(i,l,r) for (int i=l; i<=r; i++)
typedef long long ll;
using namespace std; const int N=,mod=,G=;
int n,k,ans,a[N],s[N],fac[N],fin[N],fn[N]; int ksm(int a,ll b){
int res;
for (res=; b; a=(1ll*a*a)%mod,b>>=)
if (b & ) res=(1ll*res*a)%mod;
return res;
} namespace NTT{
int n,L,rev[N];
void init(int m){
n=; L=;
while (n<=m) n<<=,L++;
for (int i=; i<n; i++) rev[i]=(rev[i>>]>>)|((i&)<<(L-));
}
void DFT(int a[],int f){
for (int i=; i<n; i++) if (i<rev[i]) swap(a[i],a[rev[i]]);
for (int i=; i<n; i<<=){
int wn=ksm(G,(f==)?(mod-)/(i<<):(mod-)-(mod-)/(i<<));
for (int p=i<<,j=; j<n; j+=p){
int w=;
for (int k=; k<i; k++,w=1ll*w*wn%mod){
int x=a[j+k],y=1ll*w*a[i+j+k]%mod; a[j+k]=(x+y)%mod; a[i+j+k]=(x-y+mod)%mod;
}
}
}
if (f==) return;
int inv=ksm(n,mod-);
for (int i=; i<n; i++) a[i]=1ll*a[i]*inv%mod;
}
void multi(int a[],int b[]){
DFT(a,); DFT(b,);
for (int i=; i<n; i++) a[i]=(1ll*a[i]*b[i])%mod;
DFT(a,-);
}
} int main(){
freopen("bzoj5093.in","r",stdin);
freopen("bzoj5093.out","w",stdout);
scanf("%d%d",&n,&k); n--; fac[]=fin[]=fn[]=;
rep(i,,k) fac[i]=1ll*fac[i-]*i%mod;
fin[k]=ksm(fac[k],mod-);
for (int i=k-; i; i--) fin[i]=(1ll*fin[i+]*(i+))%mod;
rep(i,,k) fn[i]=(1ll*fn[i-]*(n-i+))%mod;
rep(i,,k) s[i]=(((i&)?-:)*fin[i]+mod)%mod;
rep(i,,k) a[i]=(1ll*ksm(i,k)*fin[i])%mod;
NTT::init(*k+); NTT::multi(s,a);
rep(i,,min(n,k)) ans=(ans+1ll*s[i]*fac[i]%mod*fn[i]%mod*fin[i]%mod*ksm(,n-i))%mod;
printf("%lld\n",1ll*ans*(n+)%mod*ksm(,1ll*n*(n-)/)%mod);
return ;
}

[BZOJ5093]图的价值(NTT+第二类Stirling数)的更多相关文章

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

    [Lydsy1711月赛]图的价值 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 245  Solved: 128[Submit][Status][D ...

  2. bzoj5093图的价值:多项式,斯特林数(二项式反演)

    Description “简单无向图”是指无重边.无自环的无向图(不一定连通). 一个带标号的图的价值定义为每个点度数的k次方的和. 给定n和k,请计算所有n个点的带标号的简单无向图的价值之和. 因为 ...

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

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

  4. 【BZOJ5093】图的价值(第二类斯特林数,组合数学,NTT)

    [BZOJ5093]图的价值(第二类斯特林数,组合数学,NTT) 题面 BZOJ 题解 单独考虑每一个点的贡献: 因为不知道它连了几条边,所以枚举一下 \[\sum_{i=0}^{n-1}C_{n-1 ...

  5. 【题解】BZOJ5093图的价值(二项式+NTT)

    [题解]BZOJ5093图的价值(二项式+NTT) 今天才做这道题,是我太弱了 强烈吐槽c++这种垃圾语言tmd数组越界不re反倒去别的数组里搞事情我只想说QAQ 推了一张A4纸的式子 考虑每个点的度 ...

  6. [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 ...

  7. lightOJ 1326 Race(第二类Stirling数)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1326 题意:有n匹马赛跑.问有多少种不同的排名结果.可以有多匹马的排名相同. 思路:排 ...

  8. [总结] 第二类Stirling数

    上一道例题 我们来介绍第二类Stirling数 定义 第二类Stirling数实际上是集合的一个拆分,表示将n个不同的元素拆分成m个集合的方案数,记为 或者 .和第一类Stirling数不同的是,集合 ...

  9. 第二类Stirling数

    第二类斯特林数 第二类Stirling数:S2(p, k) 1.组合意义:第二类Stirling数计数的是把p个互异元素划分为k个非空集合的方法数 2.递推公式: S2(0, 0) = 1 S2(p, ...

随机推荐

  1. 【CodeForces】908 D. New Year and Arbitrary Arrangement

    [题目]Good Bye 2017 D. New Year and Arbitrary Arrangement [题意]给定正整数k,pa,pb,初始有空字符串,每次有pa/(pa+pb)的可能在字符 ...

  2. 3、CSS基本介绍

    1.1 CSS基本介绍一.web 标准所谓的web标准指的就是一系列规范网页书写的要求,它是由W3C组织制定,在它里面要求网页的结构.样式.行为三者相分离.二.名词解释1.结构:就是通过HTML标签搭 ...

  3. 设计模式之Composite

    设计模式总共有23种模式这仅仅是为了一个目的:解耦+解耦+解耦...(高内聚低耦合满足开闭原则) Composite定义? 将对象以树形结构组织起来,以达成“部分-整体” 的层次结构. 想到Compo ...

  4. discuz各个目录与文件的作用说明

    discuz下面有很多文件夹以及文件,你们都知道他们是做什么的么?肯定不知道了吧.但是我们有经常遇到这些文件,譬如在后台文件校验操作都遇到某些文件被修改,这时候也需要知道这些文件是有什么作用的.今天就 ...

  5. RTM,RTW,GA等软件版本号详解

    一直以来,对于新手而言,软件的版本号都是个比较困扰人的问题,什么Beta.RC,再来个RTM.RTW....头大了吧?RTM和RTW有什么区别?借此机会,就给大家介绍一下这方面的小知识吧. 1.软件开 ...

  6. ubuntu14.04安装使用NviDIA显卡驱动

    想给自己的ubuntu换N卡驱动的原因: 一方面,由于自己电脑在编译源代码8线程全开(make -j8)时,CPU温度呼呼涨到八九十度,从而常常导致系统保护自动关机,让人有点不爽.网上有说ubuntu ...

  7. 运维小知识之nginx---nginx配置Jboss集群负载均衡

      codyl 2016-01-26 00:53:00 浏览385 评论0 负载均衡 转自 运维小知识之nginx---nginx配置Jboss集群负载均衡-博客-云栖社区-阿里云https://yq ...

  8. Python实现好友全头像的拼接

    微信好友全头像 话不多说,直接上代码 import itchat import math import PIL.Image as Image import os itchat.auto_login() ...

  9. SyntaxError: Missing parentheses in call to 'print' 这个错误原因是Python版本问题

    问题 print "www.baidu.com"           Python2 print ("www.baidu.com")     Python3 出 ...

  10. u-boot界面添加命令[demo]

    目标板:2440 如何在u-boot界面中增加命令 在/common/目录下建立文件,调用执行函数do_bootm就行,然后在修改Makefile,就OK了. 比如在u-boot界面添加命令test ...