洛谷链接

显然颜色数量不会超过 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−i​j!⋅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=ilim⁡Gj−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=ilim​Gj−i​Fj​=i!1​∑j=0lim−i​Gj​Fj+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−i​Gj​Flim−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)相关推荐

  1. P4491-[HAOI2018]染色【二项式反演,NTT】

    正题 题目链接:https://www.luogu.com.cn/problem/P4491 题目大意 给nnn个物品染上mmm种颜色,若恰好有kkk个颜色的物品个数为SSS那么就会产生WkW_kWk ...

  2. 【HAOI2018】染色【反向二项式反演】【NTT卷积】

    传送门 题意:NNN个位置染MMM种颜色,恰好出现SSS次的颜色数量恰好为kkk时的愉悦度为wkw_kwk​,求所有方案的愉悦度之和.对100453580910045358091004535809取模 ...

  3. [2021.1.27多校省选模拟10]染色(min-max容斥/二项式反演)

    [2021.1.27多校省选模拟10]染色 突然发现我对概率期望的理解不是很好... 部分分1:可以直接进行状压dp,然后按照题意模拟即可. 部分分2:首先可以发现这个问题是min_max容斥形式,然 ...

  4. 【UOJ574】多线程计算【二元二项式反演】【定积分】【矩阵】【NTT 卷积】

    题意:有 n×mn\times mn×m 的网格,每个结点在 [0,1)[0,1)[0,1) 内的一个随机时刻被点亮.有 hhh 个数对 xi,yix_i,y_ixi​,yi​,对于一个瞬间状态,如果 ...

  5. P4491 [HAOI2018]染色

    反思 二项式反演的板子,但是还要加上一个NTT,就变得恶心人了 我NTT写挂调了好长时间... 注意 NTT应该这么写 int tmp=pow((opt)?invG:G,(MOD-1)/i); 而不这 ...

  6. 二项式反演(非详细)

    引入 二项式反演又名广义容斥定理 二项式反演可以表示成: f[n]=∑i=0n(−1)iCnigi⟺gn=∑i=0n(−1)iCnif[i]f[n]=\sum_{i=0}^n(-1)^iC_{n}^{ ...

  7. Luogu 4491 [HAOI2018]染色

    BZOJ 5306 考虑计算恰好出现$s$次的颜色有$k$种的方案数. 首先可以设$lim = min(m, \left \lfloor \frac{n}{s} \right \rfloor)$,我们 ...

  8. 洛谷·幼儿园篮球题【including范德蒙德卷积,二项式反演

    初见安~时隔良久我又回来写多项式了[靠 还是放在题目前面吧,简单讲一下这两个东西. 一.范德蒙德卷积 可以理解为:在两个有n个石子和m个石子的堆里面共选k个石子的方案数.这样这个等式的成立就很显然了. ...

  9. 二项式反演中至少与恰好的转换的问题

    有关二项式反演的东西中较难理解的是至少与恰好的转换,其余的一些东西都比较好说, 先说一个结论,把至少问题转换为恰好来做并不是存在至少与恰好就行的,因为利用二项式反演把至少与恰好转换有时候并不一定是对的 ...

最新文章

  1. 红头文件rgb红色值_拿下抖音小姐姐,我写了个口红色号识别器
  2. spring学习(26):更优雅的依赖注入 在@bean注入参数
  3. NOI数学之提高级:欧拉定理和欧拉函数
  4. mvp最小可行产品_我们如何打造最低可行产品(MVP)
  5. Dell Latitude D630 无法wubi安装Kubuntu
  6. cad在布局怎么调比例_CAD中如何在布局空间调整图形比例?
  7. diff git 指定时间_Git 自救指南
  8. 使用Idea 配置maven
  9. AndroidStudio debug
  10. JDK的KeyTool和KeyStore等加密相关
  11. 计算机会计定制性,金蝶会计软件定制
  12. Nginx配置跨域(CORS)
  13. Java中实例是什么意思?补充:new 一个对象是实例吗? 能举个小例子吗?
  14. 近红外光谱分析的原理、技术及其分析方法
  15. JRebel-JVMTI [FATAL] Couldn‘t write to C:\Users\【完美解决方案】
  16. wordpress pdf_9个适用于WordPress的最佳PDF插件
  17. 中科大计算机考研录取分数线_计算机专业学校考研难度排行榜 计算机考研难度排名...
  18. Pycharm | cv2爆红 | opencv-python安装 | Requirement already satisfied: opencv-python 有效解决方法
  19. 网页会屏蔽php代码,网站屏蔽360浏览器访问php源码js代码
  20. python定义复数数组_python数组

热门文章

  1. oracle asm磁盘头 备份,ASM磁盘头的第三个备份-Physically Addressed Metadata Redundancy
  2. 无法定位程序输入点dxgiget_美国ABB TZIDC 智能定位器调试方法
  3. python小甲鱼爬虫妹子_【Python学习日记】B站小甲鱼:爬虫
  4. curd什么意思中文_每日一句英译英:She's a ten什么意思?
  5. diy计算机组装注意事项,自己组装电脑要注意什么?DIY老司机教你装机注意事项...
  6. 计算机专业杀毒,计算机病毒查杀
  7. python 中文编码差异_Python 编码为什么那么蛋疼?
  8. php判断数组下标,php判断json或者数组格式与给定格式是否一致
  9. c++ new一个结构体_C语言结构体,又一个纸老虎,纯干货讲解(附代码)
  10. 151. 翻转字符串里的单词(思路+详解)