[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{n(n-1))}{2}-(n-1)}*\sum_{i=0}^{n-1}\binom{n-1}{i}i^k\)
\(n\le10^9,k\le2*10^5\)
模\(998244353\)
第二类斯特林数
赶紧去学第二类斯特林数啊
第二类斯特林数:\(S(n,m)\),表示把\(n\)个不同的的球放到\(m\)个相同的盒子且不允许空盒的方案数。
首先有一个\(O(n^2)\)的递推。考虑第\(n\)个球的放置,如果单独放置方案数就等于\(S(n-1,m-1)\),否则就是\(m*S(n-1,m)\),表示枚举放在那个盒子里。写出来就是
\]
边界条件:\(S(0,0)=1,S(i,0)=0(i>0)\)
然后还有各种考虑组和意义得出来的柿子
第二类斯特林数存在通项公式。因为\(m^n\)表示把\(n\)个不同的球放到\(m\)个不同的盒子里且允许空盒的方案数,我们想办法用这个东西构造出第二类斯特林数的组和意义。
首先盒子是否相同很好办,直接乘/除以\(m!\)即可。关键问题在于空盒的处理。
考虑容斥,计算“至少有\(k\)个空盒然后剩下的随便是不是空盒的方案数”,乘上一个容斥系数
\]
还有一个,反过来用第二类斯特林数来表示\(m^n\)
其实就是一个反演,但如果也同样考虑组和意义的话岂不妙哉。
枚举有几个盒子不是空的,可以直接得到如下柿子:
\]
sol
所以说这道题怎么做呢?
开始推柿子辣~
(k,j)*j!*\binom{n}{j}*2^{n-j}\\=\sum_{j=0}^{k}S
(k,j)*j!*\binom{n}{j}*2^{n-j}\]
注意\(\sum_{i=j}^{n}\binom{n}{i}\binom{i}{j}\)的组合意义:从\(n\)个里面选出任意多个(大于等于\(j\))再从中选出\(j\)个,相当于从\(n\)个中选\(j\)个然后剩下的\(n-j\)个随便选。
柿子里面的阶乘\(j!\)、组合数\(\binom{n}{j}\)、2的次幂\(2^{n-j}\)都可以\(O(k)\)处理出来。复杂度瓶颈在于第二类斯特林数的处理。
\(k\le5000\)可以直接用递推式\(O(k^2)\)处理出来,而观察其通项式会发现其实就是一个卷积形式:
\]
所以直接上\(NTT\),复杂度\(O(k\log{k})\)
但是\(CF\)上的那道题不能用\(NTT\)诶,毕竟\(10^9+7\)怎么\(NTT\)(我没说不可以啊,只是我还不会呀。。。)
update 3.28 放心\(MTT\)这个坑已经填了。
code
[CF932E]Team Work
这里我强行用通项公式然后写了个\(O(k^2)\)的多项式乘法
#include<cstdio>
#include<algorithm>
using namespace std;
const int mod = 1e9+7;
int gi()
{
int x=0,w=1;char ch=getchar();
while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if (ch=='-') w=0,ch=getchar();
while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return w?x:-x;
}
int fastpow(int a,int b)
{
int res=1;
while (b) {if (b&1) res=1ll*res*a%mod;a=1ll*a*a%mod;b>>=1;}
return res;
}
const int N = 5005;
int jc[N],C[N],two[N],inv,a[N],b[N],s[N],ans;
int main()
{
int n=gi(),k=gi();
jc[0]=1;
for (int i=1;i<=k;++i) jc[i]=1ll*jc[i-1]*i%mod;
C[0]=1;
for (int i=1;i<=k;++i) C[i]=1ll*C[i-1]*(n-i+1)%mod*fastpow(i,mod-2)%mod;
two[0]=fastpow(2,n);inv=fastpow(2,mod-2);
for (int i=1;i<=k;++i) two[i]=1ll*two[i-1]*inv%mod;
for (int i=0;i<=k;++i) a[i]=i&1?mod-fastpow(jc[i],mod-2):fastpow(jc[i],mod-2);
for (int i=0;i<=k;++i) b[i]=1ll*fastpow(i,k)*fastpow(jc[i],mod-2)%mod;
for (int i=0;i<=k;++i)
for (int j=0;j<=i;++j)
(s[i]+=1ll*a[j]*b[i-j]%mod)%=mod;
for (int i=1;i<=k;++i) (ans+=1ll*s[i]*jc[i]%mod*C[i]%mod*two[i]%mod)%=mod;
printf("%d\n",ans);
return 0;
}
[BZOJ5093]图的价值
#include<cstdio>
#include<algorithm>
using namespace std;
const int _ = 800005;
const int mod = 998244353;
int gi()
{
int x=0,w=1;char ch=getchar();
while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if (ch=='-') w=0,ch=getchar();
while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return w?x:-x;
}
int fastpow(int a,int b)
{
int res=1;
while (b) {if (b&1) res=1ll*res*a%mod;a=1ll*a*a%mod;b>>=1;}
return res;
}
int n,N,k,l;
int jc[_],C[_],two[_],inv,a[_],b[_],rev[_],ans;
void NTT(int *P,int opt)
{
for (int i=0;i<N;++i) if (i>rev[i]) swap(P[i],P[rev[i]]);
for (int i=1;i<N;i<<=1)
{
int W=fastpow(3,(mod-1)/(i<<1));
if (opt==-1) W=fastpow(W,mod-2);
for (int j=0,p=i<<1;j<N;j+=p)
{
int w=1;
for (int k=0;k<i;++k,w=1ll*w*W%mod)
{
int x=P[j+k],y=1ll*P[j+k+i]*w%mod;
P[j+k]=(x+y)%mod;P[j+k+i]=(x-y+mod)%mod;
}
}
}
if (opt==-1)
{
int Inv=fastpow(N,mod-2);
for (int i=0;i<N;++i) P[i]=1ll*P[i]*Inv%mod;
}
}
int main()
{
n=gi()-1;k=gi();
jc[0]=1;
for (int i=1;i<=k;++i) jc[i]=1ll*jc[i-1]*i%mod;
C[0]=1;
for (int i=1;i<=k;++i) C[i]=1ll*C[i-1]*(n-i+1)%mod*fastpow(i,mod-2)%mod;
two[0]=fastpow(2,n);inv=fastpow(2,mod-2);
for (int i=1;i<=k;++i) two[i]=1ll*two[i-1]*inv%mod;
for (int i=0;i<=k;++i) a[i]=i&1?mod-fastpow(jc[i],mod-2):fastpow(jc[i],mod-2);
for (int i=0;i<=k;++i) b[i]=1ll*fastpow(i,k)*fastpow(jc[i],mod-2)%mod;
for (N=1;N<=k*2;N<<=1) ++l;--l;
for (int i=0;i<N;++i) rev[i]=(rev[i>>1]>>1)|((i&1)<<l);
NTT(a,1);NTT(b,1);
for (int i=0;i<N;++i) a[i]=1ll*a[i]*b[i]%mod;
NTT(a,-1);
for (int i=0;i<=k;++i) (ans+=1ll*a[i]*jc[i]%mod*C[i]%mod*two[i]%mod)%=mod;
int Pow=(1ll*n*(n+1)/2-n)%(mod-1);
printf("%d\n",1ll*ans*fastpow(2,Pow)%mod*(n+1)%mod);
return 0;
}
[CF932E]Team Work & [BZOJ5093]图的价值的更多相关文章
- 【学术篇】CF932E Team Work && bzoj5093 图的价值
两个题的传送门 对于CF这道题, 分别考虑每种可能的集合大小, 每个大小为\(k\)的集合数量有\(\binom nk\)个, 所以最后的答案就是 \[\sum_{i=0}^n\binom{n}{i} ...
- 【题解】BZOJ5093图的价值(二项式+NTT)
[题解]BZOJ5093图的价值(二项式+NTT) 今天才做这道题,是我太弱了 强烈吐槽c++这种垃圾语言tmd数组越界不re反倒去别的数组里搞事情我只想说QAQ 推了一张A4纸的式子 考虑每个点的度 ...
- [BZOJ5093]图的价值(NTT+第二类Stirling数)
5093: [Lydsy1711月赛]图的价值 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 250 Solved: 130[Submit][Sta ...
- BZOJ5093图的价值(斯特林数)
题目描述 “简单无向图”是指无重边.无自环的无向图(不一定连通). 一个带标号的图的价值定义为每个点度数的k次方的和. 给定n和k,请计算所有n个点的带标号的简单无向图的价值之和. 因为答案很大,请对 ...
- bzoj5093图的价值:多项式,斯特林数(二项式反演)
Description “简单无向图”是指无重边.无自环的无向图(不一定连通). 一个带标号的图的价值定义为每个点度数的k次方的和. 给定n和k,请计算所有n个点的带标号的简单无向图的价值之和. 因为 ...
- Bzoj5093: 图的价值
题面 Bzoj Sol 一张无向无重边自环的图的边数最多为\(\frac{n(n-1)}{2}\) 考虑每个点的贡献 \[n*2^{\frac{n(n-1)}{2} - (n-1)}\sum_{i=0 ...
- 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\] 有这么一个式子 ...
随机推荐
- Sourcetree的安装与使用
1 安装遇到的问题 https://segmentfault.com/q/1010000007643870 解决该问题的方法: http://www.jianshu.com/p/3478e2a214a ...
- 在 CentOS7.0 上搭建 Chroot 的 Bind DNS 服务器
BIND(Berkeley internet Name Daemon)也叫做NAMED,是现今互联网上使用最为广泛的DNS 服务器程序.这篇文章将要讲述如何在 chroot 监牢中运行 BIND,这样 ...
- Sql Server 常用事务处理总结
在数据库操作中,常用事务写法: 1. 通过 @@error 判断一批sql 执行完毕,是否有异常. @@error 为系统变量,每次执行完 sql 都会返回一个数值, 0 表示 执行成功 ,非0 ...
- 前端构建工具之gulp的安装和配置
在选择构建工具时,看到更多人推荐gulp,从此入了gulp的坑- 一.安装node环境 百度谷歌一下就有了,在终端中分别输入 node -v 和 npm -v,若显示node和npm的版本号则说明no ...
- 以kaggle-titanic数据为基础的完整的机器学习
1. 引入所有需要的包 # -*- coding:utf-8 -*- # 忽略警告 import warnings warnings.filterwarnings('ignore') # 引入数据处理 ...
- javascript高级程序设计第三章的一些笔记
[TOC] 1. 语法 1.1 区分大小写 变量.函数名和操作费都区分大小写. 1.2 标识符 标识符指变量.函数.属性的名字,或者函数的参数.标识符按以下规则组合: 第一个字符必须是一个字母,下划线 ...
- Five nines
Five nines, commonly taken to mean "99.999%", may refer to: 高可用 High availability of serv ...
- hive:排序分析函数
基本排序函数 语法: rank()over([partition by col1] order by col2) dense_rank()over([partition by col1] order ...
- APICloud ajpush(极光推送) 6009
APICloud 其它的都按照APICloud的使用说明操作即可,但有一点需要提醒像我一样才接触的朋友:极光推送需打包测试,不能直接自定义Loader.否则,你会发现在绑定别名的方法时会一直返回&qu ...
- Android开发之Android Context Menu
1 Creatinga上下文菜单, Todefine上下文菜单的外观和行为,推翻youractivity的上下文菜单回滚方法,onCreateContextMenu()和onContextItemSe ...