【CF932E】Team Work/【BZOJ5093】图的价值 数学+NTT
【CF932E】Team Work
题意:求$\sum\limits_{i=1}^nC_n^ii^k$,答案模$10^9+7$。$n\le 10^9,k\le 5000$。
【BZOJ5093】图的价值
题意:“简单无向图”是指无重边、无自环的无向图(不一定连通)。一个带标号的图的价值定义为每个点度数的k次方的和。给定n和k,请计算所有n个点的带标号的简单无向图的价值之和。因为答案很大,请对998244353取模输出。
$n\le 10^9,k\le 200000$
题解:对于第二道题我们显然可以将每个点的度数分开算,枚举这个点的度数显然可以得出$ans=n\times 2^{\frac {(n-1)(n-2)} 2}\sum\limits_{i=0}^{n-1}C_n^ii^k$。那么这两道题的关键都在于如何求出$\sum\limits_{i=0}^nC_ii^k$。
由于第一道题的k比较小,这里给出一种简单的递推方法:
$\sum\limits_{i=1}^nC_n^ii^k=\sum\limits_{i=1}^nC_n^i\times i\times i^{k-1}\\=n\sum\limits_{i=1}^nC_{n-1}^{i-1}\times i^{k-1}\\=n\sum\limits_{i=1}^{n-1}C_{n-1}^i\times (i+1)^{k-1}+1$
这提醒我们用$f[k][j]=\sum\limits_{i=1}^{n-j}C_{n-j}^i\times(i+j)^k$。不难得到递推式:
$f[k][j]=\sum\limits_{i=1}^{n-j}C_{n-j}^i(i+j)^k\\=\sum\limits_{i=1}^{n-j}C_{n-j}^ii(i+j)^{k-1}+j\sum\limits_{i-1}^{n-j}C_{n-j}^i(i+j)^{k-1}\\=(n-j)\sum\limits_{i=1}^{n-j}C_{n-j-1}^{i-1}(i+j)^{k-1}+j\cdot f[k-1][j]\\=(n-j)(\sum\limits_{i=1}^{n-j-1}C_{n-j-1}^i(i+j+1)^{k-1}+(j+1)^{k-1})+j\cdot f[k-1][j]\\=(n-j)(f[k-1][j+1]+(j+1)^{k-1})+j\cdot f[k-1][j]$
$O(n^2)$算即可。注意特判$n<k$的情况。
第二题这么算就过不去了,我们换一种思路,考虑用第二类斯特林数。
$S_n^m$为第二类斯特林数,表示把n个不同的球装进m个相同的箱子里,要求箱子不能为空的方案数。我们可以用容斥来得到第二类斯特林数的通项公式。先假设箱子是有标号的,则答案要除以$m!$。我们枚举至少有i个箱子是空的,球可以随便装进其余的箱子里,那么方案数为$C_m^i\times (m-i)^n$。所以$S_n^m=\frac 1 {m!}\sum\limits_{i=0}^m(-1)^iC_m^i(m-i)^n$。
将组合数拆开,得到$S_n^m=\sum\limits_{i=0}^m\frac {(-1)^i} {i!}\frac {(m-i)^n} {(m-i)!}$。发现这个东西符合卷积的形式,所以我们可以用NTT在$O(n\log n)$的时间里预处理斯特林数。
再来考虑一个组合问题,将n个不同的球装进m个不同的箱子里,允许箱子为空的方案数是多少?我们可以枚举非空的箱子的个数,由于是有标号的,所以还要乘一个排列数,那么答案就是$\sum\limits_{i=1}^mP_m^iS_n^i$。而小学生都知道这个问题的答案就是$m^n$。所以$m^n=\sum\limits_{i=1}^mP_m^iS_n^i$。我们下面就要利用这个恒等式。
$\sum\limits_{i=0}^nC_n^ii^k=\sum\limits_{i=0}^nC_n^i\sum\limits_{j=0}^iP_i^jS_k^j\\=\sum\limits_{i=0}^nC_n^i\sum\limits_{j=0}^iC_i^jj!S_k^j\\=\sum\limits_{j=0}^nj!S_k^j\sum\limits_{i=j}^nC_n^iC_n^j$
后面那个东西是什么?在n个物品里选择i个,再从i个物品里选j个的方案数。我们可以先选j个,然后其他物品可以选也可以不选,所以就是$C_n^j\times 2^{n-j}$。
于是就变成了$\sum\limits_{j=0}^nS_k^jj!C_n^j2^{n-j}=\sum\limits_{j=0}^kS_k^jj!C_n^j2^{n-j}$。
代码:
CF932E:
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
typedef long long ll;
const ll P=1000000007;
ll n,m; ll f[2][5010],g[5010];
inline ll pm(ll x,ll y)
{
ll z=1;
while(y)
{
if(y&1) z=z*x%P;
x=x*x%P,y>>=1;
}
return z;
}
int main()
{
scanf("%lld%lld",&n,&m);
int i,j,d;
if(n<=m)
{
for(i=0;i<=n;i++)
{
d=i&1;
memset(f[d],0,sizeof(f[d]));
f[d][0]=1;
for(j=1;j<=i;j++) f[d][j]=(f[d^1][j-1]+f[d^1][j])%P;
}
ll ans=0;
for(i=1;i<=n;i++) ans=(ans+f[n&1][i]*pm(i,m))%P;
printf("%lld",ans);
return 0;
}
ll tmp=pm(2,n-m);
for(i=1;i<=m+1;i++) g[i]=1;
for(i=m;i>=0;i--) f[0][i]=tmp-1,tmp=(tmp<<1)%P;
for(i=1;i<=m;i++)
{
d=i&1;
memset(f[d],0,sizeof(f[d]));
for(j=0;j<=m-i;j++) f[d][j]=((n-j)*(f[d^1][j+1]+g[j+1])%P+j*f[d^1][j])%P,g[j+1]=g[j+1]*(j+1)%P;
}
printf("%lld",f[m&1][0]);
return 0;
}
BZ5093:
#include <cstring>
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
const ll P=998244353;
const int maxn=(1<<19)+4;
int k,len;
ll n,ans;
ll A[maxn],B[maxn],ine[maxn],jc[maxn],jcc[maxn];
inline ll pm(ll x,ll y)
{
ll z=1;
while(y)
{
if(y&1) z=z*x%P;
x=x*x%P,y>>=1;
}
return z;
}
inline ll c(int a,int b)
{
if(a<b) return 0;
return jc[a]*jcc[a-b]%P*jcc[b]%P;
}
inline void NTT(ll *a,int f)
{
int i,j,k,h;
ll t;
for(i=k=0;i<len;i++)
{
if(i>k) swap(a[i],a[k]);
for(j=(len>>1);(k^=j)<j;j>>=1);
}
for(h=2;h<=len;h<<=1)
{
ll wn;
if(f==1) wn=pm(3,(P-1)/h);
else wn=pm(3,P-1-(P-1)/h);
for(i=0;i<len;i+=h)
{
ll w=1;
for(j=i;j<i+h/2;j++) t=w*a[j+h/2]%P,a[j+h/2]=(a[j]-t)%P,a[j]=(a[j]+t)%P,w=w*wn%P;
}
}
if(f==-1)
{
t=pm(len,P-2);
for(i=0;i<len;i++) a[i]=a[i]*t%P;
}
}
int main()
{
scanf("%lld%d",&n,&k),n--;
int i;
for(len=1;len<(k<<1);len<<=1);
ine[0]=ine[1]=jc[0]=jc[1]=jcc[0]=jcc[1]=1;
for(i=2;i<=k;i++) ine[i]=P-(P/i)*ine[P%i]%P,jc[i]=jc[i-1]*i%P,jcc[i]=jcc[i-1]*ine[i]%P;
for(i=0;i<=k;i++) A[i]=((i&1)?-1:1)*jcc[i],B[i]=pm(i,k)*jcc[i]%P;
NTT(A,1),NTT(B,1);
for(i=0;i<len;i++) A[i]=A[i]*B[i]%P;
NTT(A,-1);
ll tmp=1;
for(i=0;i<=n&&i<=k;i++)
{
ans=(ans+A[i]*jc[i]%P*tmp%P*pm(2,n-i))%P;
tmp=tmp*(n-i)%P*ine[i+1]%P;
}
ans=ans*(n+1)%P*pm(2,n*(n-1)/2)%P;
ans=(ans+P)%P;
printf("%lld",ans);
return 0;
}
【CF932E】Team Work/【BZOJ5093】图的价值 数学+NTT的更多相关文章
- [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 ...
- 【学术篇】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+斯特林数)
显然每个点会提供相同的贡献.于是现在只考虑1号点的贡献.若其度数为i,则在2~n号点选i个连上,剩下的边随便连,这样可以算出答案为 这个式子可以O(n)计算.发现k比较小,于是考虑如何将这个式子化为与 ...
- [BZOJ5093]图的价值(NTT+第二类Stirling数)
5093: [Lydsy1711月赛]图的价值 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 250 Solved: 130[Submit][Sta ...
- bzoj5093图的价值:多项式,斯特林数(二项式反演)
Description “简单无向图”是指无重边.无自环的无向图(不一定连通). 一个带标号的图的价值定义为每个点度数的k次方的和. 给定n和k,请计算所有n个点的带标号的简单无向图的价值之和. 因为 ...
- BZOJ5093图的价值(斯特林数)
题目描述 “简单无向图”是指无重边.无自环的无向图(不一定连通). 一个带标号的图的价值定义为每个点度数的k次方的和. 给定n和k,请计算所有n个点的带标号的简单无向图的价值之和. 因为答案很大,请对 ...
- 【bzoj5093】[Lydsy1711月赛]图的价值(NTT+第二类斯特林数)
题意: 给定\(n\)个点,一个图的价值定义为所有点的度数的\(k\)次方之和. 现在计算所有\(n\)个点的简单无向图的价值之和. 思路: 将式子列出来: \[ \sum_{i=1}^n\sum_{ ...
- Bzoj5093: 图的价值
题面 Bzoj Sol 一张无向无重边自环的图的边数最多为\(\frac{n(n-1)}{2}\) 考虑每个点的贡献 \[n*2^{\frac{n(n-1)}{2} - (n-1)}\sum_{i=0 ...
随机推荐
- 【Postgresql】use
http://www.jianshu.com/p/0ed65e630fd0 http://www.linuxidc.com/Linux/2013-12/94354.htm tag 是一个Array字段 ...
- centos 离线安装Ambari
1.首先要下载它们的安装包,别尝试着在yum来下,特别慢,最好的方式是通过建立本地资源的方式来安装. http://public-repo-1.hortonworks.com/HDP/centos6/ ...
- 在mvc4中多语言建站的实例
环境:vs2012 asp.net mvc4. 实现方式:resource 资源文件,根据路由规则中Lang参数来判断载入哪种语言方式 在网上找到了相关资料,顺便自己做了个练习,新建工程之类的步骤就免 ...
- YII创建应用
创建第一个应用 打开cmd,切换到appserv的www目录下,输入: D:\AppServ\www>yii6\framework\yiic webapp D:wamp\www\mydemos
- 用plsql 导入导出oracle表结构数据
一.导出 (1)导出数据 进入pl/sql,"工具"---->"Export Tables...",然后在弹出的对话框中选择要导出的表,最后点击" ...
- redis配置文件相关
1. 默认情况下,redis不是在后台运行的,如果需要在后台运行,把该项的值更改为yes daemonize no 2. 当Redis在后台运行时,Redis默认会把pid写入/var/run/red ...
- 车牌、手机、身份证、等敏感信息 屏蔽 替换 、中文转unicode编码 函数
应工作要求,需要对展示的内容进行敏感信息替换.琢磨的一些时间,编写的函数匹配率还是比较高的. 顺便说下思路,使用的是正则匹配替换和字符串替换.函数可以再改进. 先把需要匹配的内容写好相应的正则,然后进 ...
- NuGet的几个小技巧(转)
NuGet的几个小技巧 因为可视化库程序包管理器的局限性,有很多需要的功能在界面中无法完成. 以下技巧均需要在“程序包管理器控制台”中使用命令来完成. 一.改变项目目标框架后,更新程序包 当改变项 ...
- Spring getBean 首字母大小写问题
如果类第一个字母大写第二个小写,那么首字母小写获取bean 如果第一个和第二个字母都是大写的,那个获取bean首字母要大写
- iOS开发-NSDictionary
判断一个字典中是否存在某个key,有两种方法: 方法一: if ([dictionary allKeys] containsObject: key]){ // cotains key operatio ...