【题解】BZOJ5093图的价值(二项式+NTT)
【题解】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;
}
转载于:https://www.cnblogs.com/winlere/p/11190351.html
【题解】BZOJ5093图的价值(二项式+NTT)相关推荐
- BZOJ5093 图的价值(NTT+斯特林数)
显然每个点会提供相同的贡献.于是现在只考虑1号点的贡献.若其度数为i,则在2~n号点选i个连上,剩下的边随便连,这样可以算出答案为 这个式子可以O(n)计算.发现k比较小,于是考虑如何将这个式子化为与 ...
- BZOJ5093图的价值(斯特林数)
题目描述 "简单无向图"是指无重边.无自环的无向图(不一定连通). 一个带标号的图的价值定义为每个点度数的k次方的和. 给定n和k,请计算所有n个点的带标号的简单无向图的价值之和. ...
- bzoj5093 图的价值【第二类斯特林数+NTT】
解题思路: 考虑直接枚举每个点连的边,图中其余点之间随便连,那么直接推式子: ans=n∗2C2n−1∑i=0n−1Cin−1ikans=n*2^{C_{n-1}^2}\sum\limits_{i=0 ...
- Bzoj5093: 图的价值
题面 Bzoj Sol 一张无向无重边自环的图的边数最多为\(\frac{n(n-1)}{2}\) 考虑每个点的贡献 \[n*2^{\frac{n(n-1)}{2} - (n-1)}\sum_{i=0 ...
- Team Work(CF 932 E)[bzoj5093][Lydsy1711月赛]图的价值
0 前言 这是一道小清新题 1 题目相关 1.1传送门 传送门 1.2 题目大意 给出n,kn,kn,k,求∑i=0n(ni)ik\sum_{i=0}^n\binom{n}{i}i^ki=0∑n(i ...
- bzoj5093: [Lydsy1711月赛]图的价值
bzoj5093: [Lydsy1711月赛]图的价值 题目描述 Solution 考虑每一个点的贡献,枚举它的度数. Ans=n∗2(n−12)∑i=1n−1(n−1i)∗ikAns=n*2^{\t ...
- [BZOJ 5093]图的价值
Description 题库链接 一个带标号的图的价值定义为每个点度数的 \(k\) 次方的和.给定 \(n\) 和 \(k\) ,请计算所有 \(n\) 个点的带标号的简单无向图的价值之和.对 \( ...
- BZOJ.5093.[Lydsy1711月赛]图的价值(NTT 斯特林数)
题目链接 对于单独一个点,我们枚举它的度数(有多少条边)来计算它的贡献:\[\sum_{i=0}^{n-1}i^kC_{n-1}^i2^{\frac{(n-2)(n-1)}{2}}\] 每个点是一样的 ...
- [gdoi2018 day1]小学生图论题【分治NTT】
正题 题目大意 一张随机的nnn个点的竞赛图,给出它的mmm条相互无交简单路径,求这张竞赛图的期望强联通分量个数. 1≤n,m≤1051\leq n,m\leq 10^51≤n,m≤105 解题思路 ...
最新文章
- 投稿近2000,NAACL 2019接收率仅为22.6%|附录取论文名单
- 多级反馈队列调度算法具体原理
- 第三次学JAVA再学不好就吃翔(part19)--二维数组
- 三十六、rsync通过服务同步、Linux系统日志、screen工具
- Windows7环境下用VirtualBox (5.1)上安装Ubuntu 17.10
- 主成分分析和因子分析十大不同点
- POJ 1252 Euro Efficiency
- 【Python】类的基本写法与注释风格
- 【LeetCode】智商题 brainteaser(共3题)
- thinkjs——两表联查
- HA功能与DRS配合使用
- MySQL 获取物理表的主键字段
- 郑州大学校园网使用指南
- 德生收音机创始人梁伟(华工杰出校友)的无线电之梦
- 我的人生观、爱情观和世界观
- STM32基于HAL工程硬件I2C读写AT24C02/04/08数据
- 【c/c++编程】数学类问题:同余模、最大公约数、最小公倍数、素数判定
- vue 大量图片展示_Ant Design of Vue 展示多张图片
- Flutter (仿微信通讯录)按字母分组列表
- Java DES 加密解密
热门文章
- 洛谷 P1463 [SDOI2005]反素数ant P1820 寻找AP数
- 更改IE浏览器的收藏夹位置
- Linux串口编程(中断方式和select方式)
- 微软MVC对架构的一点思考
- 分享-动态性能表详解
- php分块查找,索引查找(索引查找、分块查找) C语言实现
- win10鼠标灵敏度怎么调_和平精英灵敏度怎么设置才最合适 调最适合自己用的
- pythongoogle.probuf.timestamp_gRPC快速入门(一)——Protobuf简介
- python中排序的函数_Python中sorted()排序函数
- elasticsearch新增_SpringBoot 使用JestClient操作Elasticsearch