[HAOI2018] 染色(二项式反演+NTT)
洛谷链接
显然颜色数量不会超过 lim=min(m,ns)\lim=\min(m,\frac ns)lim=min(m,sn)
fi:f_i:fi: 至少有 iii 种颜色恰好出现了 sss 次的方案数。
则 fi=(mi)⋅n!(s!)i(n−is)!⋅(m−i)n−isf_i=\binom mi·\frac{n!}{(s!)^i(n-is)!}·(m-i)^{n-is}fi=(im)⋅(s!)i(n−is)!n!⋅(m−i)n−is。
mmm 种颜色中选 iii 种,(mi)\binom mi(im)。
将 nnn 个位置分成 i+1i+1i+1 个部分,钦定的 iii 种颜色每种出现 sss 次,剩下 m−im-im−i 种颜色共 n−isn-isn−is 个。
先当作是可重的全排列,即 n!s!s!...s!⏟i(n−is)!\frac{n!}{\underbrace{s!s!...s!}_i(n-is)!}is!s!...s!(n−is)!n!。
前 iii 各部分都是只有一种颜色,后面部分每个有 m−im−im−i 种取法,所以要乘上 (m−i)n−is(m-i)^{n-is}(m−i)n−is。
ansi:ans_i:ansi: 恰有 iii 个颜色出现恰好 sss 次的方案数。
直接二项式反演:ansi=∑j=ilim(−1)j−i(ji)fjans_i=\sum_{j=i}^{\lim}(-1)^{j-i}\binom jif_jansi=∑j=ilim(−1)j−i(ij)fj。
ansi=∑j=ilim(−1)j−i(ji)fj=∑j=ilim(−1)j−1j!i!(j−i)!fj⇒ansi⋅i!=∑j=ilim(−1)j−i(j−i)!j!⋅fjans_i=\sum_{j=i}^{\lim}(-1)^{j-i}\binom jif_j=\sum_{j=i}^{\lim}(-1)^{j-1}\frac{j!}{i!(j-i)!}f_j\Rightarrow ans_i·i!=\sum_{j=i}^{\lim}\frac{(-1)^{j-i}}{(j-i)!}j!·f_j ansi=j=i∑lim(−1)j−i(ij)fj=j=i∑lim(−1)j−1i!(j−i)!j!fj⇒ansi⋅i!=j=i∑lim(j−i)!(−1)j−ij!⋅fj
令 Fi=i!⋅fi,Gi=(−1)ii!F_i=i!·f_i,G_i=\frac{(-1)^i}{i!}Fi=i!⋅fi,Gi=i!(−1)i,则 ansi=1i!∑j=ilimGj−iFj=1i!∑j=0lim−iGjFj+ians_i=\frac{1}{i!}\sum_{j=i}^{\lim} G_{j-i}F_j=\frac{1}{i!}\sum_{j=0}^{\lim-i}G_jF_{j+i}ansi=i!1∑j=ilimGj−iFj=i!1∑j=0lim−iGjFj+i。
反转 FFF,即 Fi=(lim−i)!⋅flim−iF_i=(\lim-i)!·f_{\lim-i}Fi=(lim−i)!⋅flim−i,则 ansi=1i!∑j=0lim−iGjFlim−i−jans_i=\frac{1}{i!}\sum_{j=0}^{\lim-i}G_jF_{\lim-i-j}ansi=i!1∑j=0lim−iGjFlim−i−j。
可以卷了 G∗FG*FG∗F,NTT\text{NTT}NTT 做即可。
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define mod 1004535809
#define maxn 10000005
#define maxm 500000
int fac[maxn], inv[maxn], r[maxm], W[maxm], f[maxm], g[maxm];
int len;int qkpow( int x, int y ) {int ans = 1;while( y ) {if( y & 1 ) ans = ans * x % mod;x = x * x % mod;y >>= 1;}return ans;
}void NTT( int *c, int op ) {for( int i = 0;i < len;i ++ ) if( i < r[i] ) swap( c[i], c[r[i]] );for( int i = 1;i < len;i <<= 1 ) {int omega = qkpow( op == 1 ? 3 : mod / 3 + 1, (mod - 1) / (i << 1) );for( int j = 0;j < len;j += (i << 1) )for( int k = 0, w = 1;k < i;k ++, w = w * omega % mod ) {int x = c[j + k], y = c[j + k + i] * w % mod;c[j + k] = ( x + y ) % mod;c[j + k + i] = ( x - y + mod ) % mod;}}if( op == -1 ) {int inv = qkpow( len, mod - 2 );for( int i = 0;i < len;i ++ ) c[i] = c[i] * inv % mod;}
}void init( int n ) {fac[0] = inv[0] = 1;for( int i = 1;i <= n;i ++ ) fac[i] = fac[i - 1] * i % mod;inv[n] = qkpow( fac[n], mod - 2 );for( int i = n - 1;i;i -- ) inv[i] = inv[i + 1] * ( i + 1 ) % mod;
}int C( int n, int m ) { return fac[n] * inv[m] % mod * inv[n - m] % mod; }signed main() {int n, m, s;scanf( "%lld %lld %lld", &n, &m, &s );for( int i = 0;i <= m;i ++ ) scanf( "%lld", &W[i] );init( max( n, m ) );int lim = min( m, n / s );for( int i = 0;i <= lim;i ++ ) {f[i] = fac[i] * C(m, i) % mod * fac[n] % mod * qkpow(inv[s], i) % mod * inv[n - i * s] % mod * qkpow(m - i, n - i * s) % mod;g[i] = (i & 1) ? mod - inv[i] : inv[i];}reverse( f, f + lim + 1 );int l;for( len = 1, l = 0;len <= (lim << 1);len <<= 1, l ++ );for( int i = 0;i < len;i ++ ) r[i] = (r[i >> 1] >> 1) | ((i & 1) << l - 1 );NTT( f, 1 ), NTT( g, 1 );for( int i = 0;i < len;i ++ ) f[i] = f[i] * g[i] % mod;NTT( f, -1 );int ans = 0;for( int i = 0;i <= lim;i ++ ) ( ans += W[i] * inv[i] % mod * f[lim - i] ) %= mod;printf( "%lld\n", ans );return 0;
}
[HAOI2018] 染色(二项式反演+NTT)相关推荐
- P4491-[HAOI2018]染色【二项式反演,NTT】
正题 题目链接:https://www.luogu.com.cn/problem/P4491 题目大意 给nnn个物品染上mmm种颜色,若恰好有kkk个颜色的物品个数为SSS那么就会产生WkW_kWk ...
- 【HAOI2018】染色【反向二项式反演】【NTT卷积】
传送门 题意:NNN个位置染MMM种颜色,恰好出现SSS次的颜色数量恰好为kkk时的愉悦度为wkw_kwk,求所有方案的愉悦度之和.对100453580910045358091004535809取模 ...
- [2021.1.27多校省选模拟10]染色(min-max容斥/二项式反演)
[2021.1.27多校省选模拟10]染色 突然发现我对概率期望的理解不是很好... 部分分1:可以直接进行状压dp,然后按照题意模拟即可. 部分分2:首先可以发现这个问题是min_max容斥形式,然 ...
- 【UOJ574】多线程计算【二元二项式反演】【定积分】【矩阵】【NTT 卷积】
题意:有 n×mn\times mn×m 的网格,每个结点在 [0,1)[0,1)[0,1) 内的一个随机时刻被点亮.有 hhh 个数对 xi,yix_i,y_ixi,yi,对于一个瞬间状态,如果 ...
- P4491 [HAOI2018]染色
反思 二项式反演的板子,但是还要加上一个NTT,就变得恶心人了 我NTT写挂调了好长时间... 注意 NTT应该这么写 int tmp=pow((opt)?invG:G,(MOD-1)/i); 而不这 ...
- 二项式反演(非详细)
引入 二项式反演又名广义容斥定理 二项式反演可以表示成: f[n]=∑i=0n(−1)iCnigi⟺gn=∑i=0n(−1)iCnif[i]f[n]=\sum_{i=0}^n(-1)^iC_{n}^{ ...
- Luogu 4491 [HAOI2018]染色
BZOJ 5306 考虑计算恰好出现$s$次的颜色有$k$种的方案数. 首先可以设$lim = min(m, \left \lfloor \frac{n}{s} \right \rfloor)$,我们 ...
- 洛谷·幼儿园篮球题【including范德蒙德卷积,二项式反演
初见安~时隔良久我又回来写多项式了[靠 还是放在题目前面吧,简单讲一下这两个东西. 一.范德蒙德卷积 可以理解为:在两个有n个石子和m个石子的堆里面共选k个石子的方案数.这样这个等式的成立就很显然了. ...
- 二项式反演中至少与恰好的转换的问题
有关二项式反演的东西中较难理解的是至少与恰好的转换,其余的一些东西都比较好说, 先说一个结论,把至少问题转换为恰好来做并不是存在至少与恰好就行的,因为利用二项式反演把至少与恰好转换有时候并不一定是对的 ...
最新文章
- 红头文件rgb红色值_拿下抖音小姐姐,我写了个口红色号识别器
- spring学习(26):更优雅的依赖注入 在@bean注入参数
- NOI数学之提高级:欧拉定理和欧拉函数
- mvp最小可行产品_我们如何打造最低可行产品(MVP)
- Dell Latitude D630 无法wubi安装Kubuntu
- cad在布局怎么调比例_CAD中如何在布局空间调整图形比例?
- diff git 指定时间_Git 自救指南
- 使用Idea 配置maven
- AndroidStudio debug
- JDK的KeyTool和KeyStore等加密相关
- 计算机会计定制性,金蝶会计软件定制
- Nginx配置跨域(CORS)
- Java中实例是什么意思?补充:new 一个对象是实例吗? 能举个小例子吗?
- 近红外光谱分析的原理、技术及其分析方法
- JRebel-JVMTI [FATAL] Couldn‘t write to C:\Users\【完美解决方案】
- wordpress pdf_9个适用于WordPress的最佳PDF插件
- 中科大计算机考研录取分数线_计算机专业学校考研难度排行榜 计算机考研难度排名...
- Pycharm | cv2爆红 | opencv-python安装 | Requirement already satisfied: opencv-python 有效解决方法
- 网页会屏蔽php代码,网站屏蔽360浏览器访问php源码js代码
- python定义复数数组_python数组
热门文章
- oracle asm磁盘头 备份,ASM磁盘头的第三个备份-Physically Addressed Metadata Redundancy
- 无法定位程序输入点dxgiget_美国ABB TZIDC 智能定位器调试方法
- python小甲鱼爬虫妹子_【Python学习日记】B站小甲鱼:爬虫
- curd什么意思中文_每日一句英译英:She's a ten什么意思?
- diy计算机组装注意事项,自己组装电脑要注意什么?DIY老司机教你装机注意事项...
- 计算机专业杀毒,计算机病毒查杀
- python 中文编码差异_Python 编码为什么那么蛋疼?
- php判断数组下标,php判断json或者数组格式与给定格式是否一致
- c++ new一个结构体_C语言结构体,又一个纸老虎,纯干货讲解(附代码)
- 151. 翻转字符串里的单词(思路+详解)