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

今天才做这道题,是我太弱了

强烈吐槽c++这种垃圾语言tmd数组越界不re反倒去别的数组里搞事情我只想说QAQ

推了一张A4纸的式子

考虑每个点的度数,因为每个点虽然有标号但是是等价的,对于每个点,对于答案的贡献是\(x\),答案输出\(n\times x\)就好了,所以答案是

\[n\sum_{i=1}^{n-1} i^{k} {n-1\choose i}2^{\frac {n(n-1)} 2-(n-1)}
\]

顺次解释:度数\(^k\),选择\(i\)个别的点去连接,剩下的边随便连

无关项提出来

\[n2^{\frac {n(n-1)} 2-(n-1)}\sum_{i=1}^{n-1} i^{k} {n-1\choose i}
\]

现在就是要求

\[\sum_{i=1}^{n-1} i^{k} {n-1\choose i}
\]

自然幂数和公式

\[i^k=\sum_{j=0}^{\min\{i,k\}} {k\brace j}\begin{pmatrix} i \\j\end{pmatrix}j!
\]

套进去

\[\sum_{i=1}^{n-1} \sum_{j=0}^{\min\{i,k\}} {k\brace j}\begin{pmatrix} i \\j\end{pmatrix}j! {n-1\choose i}
\]

先枚举\(j\)

\[\sum_{j=0}^{n-1}\sum_{i=j}^{n-1}{k\brace j}j!{n-1\choose i}{i\choose j}
\]

整理

\[\sum_{j=0}^{n-1}{k\brace j}j!\sum_{i=j}^{n-1}{n-1\choose i}{i\choose j}
\]

套一下公式(备胎模型)

\[\sum_{j=0}^{n-1}{k\brace j}j!\sum_{i=j}^{n-1}{n-1-j\choose j}{n-1-j\choose i-j}
\]

又可以提出来

\[\sum_{j=0}^{n-1}{k\brace j}{n-1-j\choose j}j!\sum_{i=j}^{n-1}{n-1-j\choose i-j}
\]

稍微改变一下形式

\[\sum_{j=0}^{n-1}{k\brace j}{n-1-j\choose j}j!\sum_{c=i-j=0}^{c=i-j\le n-1-j}{n-1-j\choose c}
\]

二项式定理套

\[\sum_{j=0}^{n-1}{k\brace j}{n-1-j\choose j}j!2^{n-1-j}
\]

我们晓得当\(k > j\)时式子的值\(=0\),所以枚举到\(\min \{n-1,k\}\)就好了。问题在于如何快速求那个斯特林数

斯特林数的容斥式

\[{k\brace j}=\dfrac 1{j!} \sum_{i=0}^{j-1} (-1)^i{\begin{pmatrix}j\\i\end{pmatrix}}(j-i)^{k}
\]

拆拆又是一个NTT的式子,不赘述了,看上面那个链接博客里有

答案式子

\[n2^{\frac {n(n-1)} 2-(n-1)}\sum_{j=0}^{n-1}{k\brace j}{n-1-j\choose j}j!2^{n-1-j}
\]

指数上取膜,又是欧拉定理

写一下NTT就好了

//@winlere
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm> using namespace std; typedef long long ll;
inline int qr(){
register int ret=0,f=0;
register char c=getchar();
while(c<48||c>57)f|=c==45,c=getchar();
while(c>=48&&c<=57) ret=ret*10+c-48,c=getchar();
return f?-ret:ret;
} namespace poly{
const int maxn=1<<19|1;
int a[maxn],b[maxn],r[maxn];
int savlen;
inline void getr(const int&len){
if(len==savlen)return;
int cnt=0;
for(register int t=1;t<len;t<<=1)++cnt;
for(register int t=1;t<len;++t)
r[t]=r[t>>1]>>1|(t&1)<<cnt>>1;
}
const int mod=998244353;
const int g=3;
inline int ksm(int base,int p){
register int ret=1;
for(base%=mod;p;p>>=1,base=1ll*base*base%mod)
if(p&1) ret=1ll*ret*base%mod;
return ret;
}
const int gi=ksm(3,mod-2);
inline void NTT(int*a,const int&len,const int&tag){
getr(len);
for(register int t=1;t<len;++t)
if(r[t]>t) swap(a[t],a[r[t]]);
int *a1,*a0,s=g;
if(tag!=1) s=gi;
for(register int t=1,wn;t<len;t<<=1){
wn=ksm(s,(mod-1)/(t<<1));
for(register int i=0;i<len;i+=t<<1){
a1=(a0=a+i)+t;
for(register int j=0,w=1,tm;j<t;++j,++a1,++a0,w=1ll*w*wn%mod){
tm=1ll**a1*w%mod;
*a1=(*a0-tm)%mod;
*a0=(*a0+tm)%mod;
if(*a1<0)*a1+=mod;
}
}
}
if(tag!=1)
for(register int t=0,in=ksm(len,mod-2);t<len;++t)
a[t]=1ll*a[t]*in%mod;
}
} using poly::mod;
using poly::NTT;
using poly::ksm;
const int maxn=2e5+5;
int jc[maxn],inv[maxn];
int t1[1<<19|1];
int s[1<<19|1];
int n,k,L,len;
int ret,ans; inline void pre(){
jc[0]=inv[0]=1;
for(register int t=1;t<maxn;++t)
jc[t]=1ll*jc[t-1]*t%mod;
inv[maxn-1]=ksm(jc[maxn-1],mod-2);
for(register int t=maxn-2;t;--t){
inv[t]=1ll*inv[t+1]*(t+1)%mod;
//if(t<15)cout<<"qaq="<<inv[t]<<endl;
if(inv[t]==0) return void(cout<<"t="<<t<<endl);
}
} inline int c(const int&n,const int&m){
if(n<m)return 0;
return 1ll*jc[n]*inv[m]%mod*inv[n-m]%mod;
} int main(){
pre();
n=qr();k=qr();
L=min(n-1,k);
len=1;
while(len<=L)len<<=1;
for(register int t=0;t<=L;++t){
s[t]=inv[t];
if(t&1) s[t]=mod-s[t];
t1[t]=1ll*inv[t]*ksm(t,k)%mod;
} NTT(t1,len<<1,1);NTT(s,len<<1,1); for(register int t=0;t<len<<1;++t) s[t]=1ll*s[t]*t1[t]%mod;
NTT(s,len<<1,-1);
for(register int t=k+1;t<len<<1;++t) s[t]=0;
int p=(1ll*n*(n-1ll)/2%(mod-1)-n+1+mod-1)%(mod-1);
ret=1ll*ksm(2,p)*(n%mod)%mod;
int w=1;
for(register int t=0;t<=L;++t){
ans=(ans+1ll*jc[t]*w%mod*ksm(2,n-1-t)%mod*s[t]%mod)%mod;
w=1ll*w*(n-1-t)%mod*inv[t+1]%mod*jc[t]%mod;
}
cout<<1ll*ret*ans%mod<<endl;
return 0;
}

【题解】BZOJ5093图的价值(二项式+NTT)的更多相关文章

  1. BZOJ5093 图的价值(NTT+斯特林数)

    显然每个点会提供相同的贡献.于是现在只考虑1号点的贡献.若其度数为i,则在2~n号点选i个连上,剩下的边随便连,这样可以算出答案为 这个式子可以O(n)计算.发现k比较小,于是考虑如何将这个式子化为与 ...

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

  3. 【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]图的价 ...

  4. [BZOJ5093]图的价值(NTT+第二类Stirling数)

    5093: [Lydsy1711月赛]图的价值 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 250  Solved: 130[Submit][Sta ...

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

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

  6. 【bzoj5093】[Lydsy1711月赛]图的价值(NTT+第二类斯特林数)

    题意: 给定\(n\)个点,一个图的价值定义为所有点的度数的\(k\)次方之和. 现在计算所有\(n\)个点的简单无向图的价值之和. 思路: 将式子列出来: \[ \sum_{i=1}^n\sum_{ ...

  7. BZOJ5093图的价值(斯特林数)

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

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

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

  9. Bzoj5093: 图的价值

    题面 Bzoj Sol 一张无向无重边自环的图的边数最多为\(\frac{n(n-1)}{2}\) 考虑每个点的贡献 \[n*2^{\frac{n(n-1)}{2} - (n-1)}\sum_{i=0 ...

随机推荐

  1. 02docker简单使用和配置(网络、存储和Hub)

    四:网络 1:命名容器 在各种docker命令中,可以通过名字中找到对应的容器.之前创建的容器都是由docker自动命名的,可以在docker  run中,通过--name参数指定容器的名字.比如: ...

  2. 直击 KubeCon 现场 | 阿里云 Hands-on Workshop 亮点回顾

    相关文章链接[合集]规模化落地云原生,阿里云亮相 KubeCon China沉淀九年,一文看清阿里云原生大事件 2019 年 6 月 24 日至 26 日,KubeCon + CloudNativeC ...

  3. laravel 踩坑 env,config

    正常情况: env 方法 可以获取 .env 文件的值 config 可以获取 config 文件夹下 指定配置的值 非正常情况: 当我们执行了 php artisan config:cache 之后 ...

  4. Android 使用Toolbar+DrawerLayout快速实现仿“知乎APP”侧滑导航效果

    在以前,做策划导航的时候,最常用的组件便是SlidingMenu了,当初第一次用它的时候觉得那个惊艳啊,体验可以说是非常棒. 后来,Android自己推出了一个可以实现策划导航的组件DrawerLay ...

  5. oracle函数 LENGTHC(c1).LENGTH2(c1).LENGTH4(c1)

    [功能]返回字符串的长度; [说明]多字节符(汉字.全角符等),按1个字符计算 [参数]C1 字符串 [返回]数值型 [示例] SQL> select length('高乾竞'),length( ...

  6. 一条数据的漫游 -- X-Engine SIGMOD Paper Introduction

    大多数人追寻永恒的家园(归宿),少数人追寻永恒的航向. ----瓦尔特.本雅明 背景 X-Engine是阿里数据库产品事业部自研的OLTP数据库存储引擎,作为自研数据库POLARDB X的存储引擎,已 ...

  7. oracle merge into 新增或者修改

    merge into sn_balance b1 using(select 'admin' as userid,1 as type1 from dual) b2 on(b1.userid=b2.use ...

  8. HOSt ip is not allowed to connect to this MySql server, MYSQL添加远程用户或允许远程访问三种方法

    HOSt ip is not allowed to connect to this MySql server 报错:1130-host ... is not allowed to connect to ...

  9. Postman接口测试工具学习笔记

    - 新建测试接口 在Postman中有两种新建测试接口的方式,第一种是图片右上角的,点击可以选择 request 请求进行新建 选择 Request 以后会出现下面图片的对话框,让你输入一个保存接口的 ...

  10. Django OMR QuerySet的特性/存在意义

    QuerySet存在的意义主要在惰性机制和缓存两点 ---------->惰性机制: 所谓惰性机制:Publisher.objects.all()或者.filter()等都只是返回了一个Quer ...