[HAOI2018]染色
题解
我竟然能自己想出来计数题
容斥+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]染色相关推荐
- P4491 [HAOI2018]染色
反思 二项式反演的板子,但是还要加上一个NTT,就变得恶心人了 我NTT写挂调了好长时间... 注意 NTT应该这么写 int tmp=pow((opt)?invG:G,(MOD-1)/i); 而不这 ...
- HAOI2018 染色
传送门 一道非常好的容斥+NTT,对我这样的菜鸡难度稍高. 符合要求的颜色最多有\(lim = min(m,\lfloor\frac{n}{S}\rfloor)\)种. 首先,考虑恰好出现S次不是很容 ...
- [HAOI2018] 染色(二项式反演+NTT)
洛谷链接 显然颜色数量不会超过 lim=min(m,ns)\lim=\min(m,\frac ns)lim=min(m,sn) fi:f_i:fi: 至少有 iii 种颜色恰好出现了 sss ...
- Luogu 4491 [HAOI2018]染色
BZOJ 5306 考虑计算恰好出现$s$次的颜色有$k$种的方案数. 首先可以设$lim = min(m, \left \lfloor \frac{n}{s} \right \rfloor)$,我们 ...
- PKUWC2019游记
PKUWC2019游记 \(Day\) 很久之前 听说 \(440\) 能去 \(PKUWC\),惊喜啊!其实就是为期末考爆炸找个借口 最近感觉学了不少东西.虽然 \(PKUWC\) 的题目以组合和数 ...
- 「HAOI2018」染色 解题报告
「HAOI2018」染色 是个套路题.. 考虑容斥 则恰好为\(k\)个颜色恰好为\(c\)次的贡献为 \[ \binom{m}{k}\sum_{i\ge k}(-1)^{i-k}\binom{m-k ...
- 【HAOI2018】染色【反向二项式反演】【NTT卷积】
传送门 题意:NNN个位置染MMM种颜色,恰好出现SSS次的颜色数量恰好为kkk时的愉悦度为wkw_kwk,求所有方案的愉悦度之和.对100453580910045358091004535809取模 ...
- [C] 深度优先搜索解决连通块/染色问题——求岛的个数
本文介绍用DFS解决连通块个数问题 有关dfs的介绍见另外一篇:不撞南墙不回头--深度优先搜索 例题 宝岛探险 题目描述 一个小岛由一个主岛和一些复附属岛屿组成,该岛使用一个二维矩阵表示,其中数字表示 ...
- [BZOJ4033][HAOI2015]树上染色
4033: [HAOI2015]树上染色 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 2108 Solved: 901 [Submit][Sta ...
最新文章
- 关于string的一些心得体会
- Oracle的自定义函数浅析
- Chrome DevTools进阶教程
- 哈哈,终于想着注册博客了
- 2019.01.26 codeforces 1096G. Lucky Tickets(生成函数)
- javascript函数式_JavaScript中的函数式编程原理
- SpringBoot整合Shiro使用Ehcache等缓存无效问题
- centos7 网卡配置vlan_CentOS7网卡创建vlan步骤
- HPU算法协会公开课第一期:【基础算法1】(STL 自定义sort 前缀和差分)
- CF755F PolandBall and Gifts
- python中squeeze函数_详解pytorch中squeeze()和unsqueeze()函数介绍
- Work20230330
- transformer--ViT
- owt webrtc 音频没有声音
- 网络——路由进阶与安全
- 抖音话题怎么选热门?为什么要做抖音话题
- 项目商业模式的设计与思考
- 职称计算机ppt2003注意,【资格考试】职称计算机_PPT2003ppt模版课件.ppt
- R | RColorBrewer颜色设置
- windows主机和linux主机互相通信。
热门文章
- lol简介/html
- 卡夫卡(kafka)
- svn服务器搭建及使用 二
- 关于Block Formatting Context--BFC和IE的hasLayout
- 利用Attribute和IErrorHandler处理WCF全局异常
- 计算机基础理论汇编,计算机基础知识:计算机中的汇编语言
- linux patches工具,patch工具入门
- C++知识点22——使用C++标准库(顺序容器list的初始化、赋值、访问、交换、添加、删除与迭代器失效)
- HALCON标定倾斜安装镜头
- 卢京潮自动控制原理ppt_视觉定位系统在贴片机中的使用与原理作用