题解

我竟然能自己想出来计数题

容斥+NTT
首先一看到题目让求恰好出现\(S\)次的颜色有恰好\(K\)种就想到容斥
如果容斥每种颜色出现次数的话并不好计数
那么考虑容斥恰好出现\(S\)次的颜色有几种
设\(F(i)\)表示恰好出现\(S\)次的颜色有至少\(i\)种
那么很显然\(F(i) = C(n , iS) * C(m , i) * \frac{(iS)!}{S!^i} * (m - i) ^ {n - iS}\)
表示从\(n\)个位置中选出\(iS\)个位置用来涂这\(i\)种颜色,然后从\(m\)种颜色中选择了\(i\)种颜色,在选出的\(iS\)个位置每种颜色都涂上\(S\)个的方案数再乘上选剩下的\(n-iS\)个位置随便的放选剩下的\(m-i\)种颜色
然后设\(f(k)\)表示恰好出现\(S\)次的颜色有恰好\(k\)种
那么容斥就很显然了\(f(k)=\sum_{i=k}^{m}{(-1)^{i - k}C(i , k)F(i)}\)
这样复杂度就是\(O(n^2)\)
然后考虑把这个\(f(k)\)给化开
\(f(k)=\sum_{i=k}^{m}{(-1)^{i-k}C(i,k)C(n,iS)C(m,i)\frac{(iS)!}{S!^i}(m-i)^{n-iS}}\)
然后把组合数都化开
\(f(k)=\sum_{i=k}^{m}{(-1)^{i-k}\frac{i!}{k!(i-k)!}\frac{n!}{iS!(n-iS)!}\frac{m!}{i!(m-i)!}\frac{(iS)!}{S!^i}(m-i)^{n-iS}}\)
然后把能消的都消掉就成了\(f(k)=\frac{n!m!}{k!}\sum_{i=k}^{m}{\frac{(-1)^{i-k}}{(i-k)!}\frac{(m-i)^{n-iS}}{(n-iS)!(m-i)!S!^i}}\)
然后可以发现后面那些东西可以设为\(g(i)\)
前面那些东西可以设为\(t(i-k)\)
那么把\(g\)倒过来卷积即可

代码

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
# define LL long long
const int M = 400005 ;
const int N = 10000005 ;
const int mod = 1004535809 ;
const int G = 3 ;
using namespace std ;inline int read() {char c = getchar() ; int x = 0 , w = 1 ;while(c>'9'||c<'0') { if(c=='-') w = -1 ; c = getchar() ; }while(c>='0'&&c<='9') { x = x*10+c-'0' ; c = getchar() ; }return x*w ;
}int n , m , S , upp ;
int val[M] , fac[N] ;
int lim = 1 , len ;
LL a[M] , b[M] , r[M] , ans ;inline int Fpw(int Base , int k) {int temp = 1 ; Base = (Base % mod + mod) % mod ;while(k) {if(k & 1) temp = 1LL * temp * Base % mod ;Base = 1LL * Base * Base % mod ; k >>= 1 ;}return temp ;
}
inline int inv(int x) {x = (x % mod + mod) % mod ;return Fpw(x , mod - 2) ;
}
inline void NTT(LL *A , int unit) {for(int i = 1 ; i <= lim ; i ++) if(r[i] > i) swap(A[i] , A[r[i]]) ;for(int mid = 1 ; mid < lim ; (mid <<= 1)) {LL R = (mid << 1) ; LL W = Fpw(unit > 0 ? G : inv(G) , (mod - 1) / R) ;for(int j = 0 ; j < lim ; j += R) {LL w = 1 ;for(int k = 0 ; k < mid ; k ++ , w = (w * W) % mod) {LL x = A[j + k] , y = w * A[j + k + mid] % mod ;A[j + k] = (x + y) % mod ; A[j + k + mid] = (x - y) % mod ;}}}
}
int main() {n = read() ; m = read() ; S = read() ;for(int i = 0 ; i <= m ; i ++) val[i] = read() ;if(S) upp = min(n / S , m) ; else upp = m ;fac[0] = 1 ; for(int i = 1 ; i <= max(n , m) ; i ++) fac[i] = 1LL * fac[i - 1] * i % mod ;for(int i = 0 ; i <= upp ; i ++) {a[i] = 1LL * Fpw(m - i , n - i * S) * inv(fac[n - i * S]) % mod * inv(fac[m - i]) % mod * inv( Fpw( fac[S] , i ) ) % mod ;b[i] = 1LL * Fpw(-1 , i) * inv(fac[i]) % mod ;}for(int i = 0 ; i <= upp / 2 ; i ++) swap(a[i] , a[upp - i]) ;while(lim <= upp * 2) (lim <<= 1) , ++ len ;for(int i = 1 ; i <= lim ; i ++) r[i] = ((r[i >> 1] >> 1) | ((i & 1) << (len - 1))) ;NTT(a , 1) ; NTT(b , 1) ;for(int i = 0 ; i <= lim ; i ++) a[i] = (a[i] * b[i] % mod + mod) % mod ;NTT(a , -1) ; LL tinv = inv(lim) ;for(int i = 0 ; i <= upp ; i ++) {LL temp = (a[upp - i] * tinv % mod + mod) % mod ;ans = (ans + 1LL * val[i] * temp % mod * fac[n] % mod * fac[m] % mod * inv(fac[i]) % mod) ;ans = (ans % mod + mod) % mod ;}printf("%lld\n",ans) ;return 0 ;
}

转载于:https://www.cnblogs.com/beretty/p/10486314.html

[HAOI2018]染色相关推荐

  1. P4491 [HAOI2018]染色

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

  2. HAOI2018 染色

    传送门 一道非常好的容斥+NTT,对我这样的菜鸡难度稍高. 符合要求的颜色最多有\(lim = min(m,\lfloor\frac{n}{S}\rfloor)\)种. 首先,考虑恰好出现S次不是很容 ...

  3. [HAOI2018] 染色(二项式反演+NTT)

    洛谷链接 显然颜色数量不会超过 lim⁡=min⁡(m,ns)\lim=\min(m,\frac ns)lim=min(m,sn​) fi:f_i:fi​: 至少有 iii 种颜色恰好出现了 sss ...

  4. Luogu 4491 [HAOI2018]染色

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

  5. PKUWC2019游记

    PKUWC2019游记 \(Day\) 很久之前 听说 \(440\) 能去 \(PKUWC\),惊喜啊!其实就是为期末考爆炸找个借口 最近感觉学了不少东西.虽然 \(PKUWC\) 的题目以组合和数 ...

  6. 「HAOI2018」染色 解题报告

    「HAOI2018」染色 是个套路题.. 考虑容斥 则恰好为\(k\)个颜色恰好为\(c\)次的贡献为 \[ \binom{m}{k}\sum_{i\ge k}(-1)^{i-k}\binom{m-k ...

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

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

  8. [C] 深度优先搜索解决连通块/染色问题——求岛的个数

    本文介绍用DFS解决连通块个数问题 有关dfs的介绍见另外一篇:不撞南墙不回头--深度优先搜索 例题 宝岛探险 题目描述 一个小岛由一个主岛和一些复附属岛屿组成,该岛使用一个二维矩阵表示,其中数字表示 ...

  9. [BZOJ4033][HAOI2015]树上染色

    4033: [HAOI2015]树上染色 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 2108  Solved: 901 [Submit][Sta ...

最新文章

  1. 关于string的一些心得体会
  2. Oracle的自定义函数浅析
  3. Chrome DevTools进阶教程
  4. 哈哈,终于想着注册博客了
  5. 2019.01.26 codeforces 1096G. Lucky Tickets(生成函数)
  6. javascript函数式_JavaScript中的函数式编程原理
  7. SpringBoot整合Shiro使用Ehcache等缓存无效问题
  8. centos7 网卡配置vlan_CentOS7网卡创建vlan步骤
  9. HPU算法协会公开课第一期:【基础算法1】(STL 自定义sort 前缀和差分)
  10. CF755F PolandBall and Gifts
  11. python中squeeze函数_详解pytorch中squeeze()和unsqueeze()函数介绍
  12. Work20230330
  13. transformer--ViT
  14. owt webrtc 音频没有声音
  15. 网络——路由进阶与安全
  16. 抖音话题怎么选热门?为什么要做抖音话题
  17. 项目商业模式的设计与思考
  18. 职称计算机ppt2003注意,【资格考试】职称计算机_PPT2003ppt模版课件.ppt
  19. R | RColorBrewer颜色设置
  20. windows主机和linux主机互相通信。

热门文章

  1. lol简介/html
  2. 卡夫卡(kafka)
  3. svn服务器搭建及使用 二
  4. 关于Block Formatting Context--BFC和IE的hasLayout
  5. 利用Attribute和IErrorHandler处理WCF全局异常
  6. 计算机基础理论汇编,计算机基础知识:计算机中的汇编语言
  7. linux patches工具,patch工具入门
  8. C++知识点22——使用C++标准库(顺序容器list的初始化、赋值、访问、交换、添加、删除与迭代器失效)
  9. HALCON标定倾斜安装镜头
  10. 卢京潮自动控制原理ppt_视觉定位系统在贴片机中的使用与原理作用