【题解】HAOI2018染色
好坑啊不开心……
其实这题的想法还是比较简单粗暴的。题目明示恰好xxx,显然排除斜率二分这个玩意儿,那么不就只剩下容斥了嘛……
令 \(A_{x}\) 为恰好出现了 \(S\) 次的至少有 \(x\) 种的方案数, \({B_{x}}\) 为恰好出现了\(S\) 次的颜色恰好 \(x\) 种的方案数。\(A_{x}\) 可以 \(O(1)\) 求得,\(A_{x} = \frac{\binom{n}{S * x} * (m - x) ^ {n - S * x} * (S * i)!}{(S!)^{x}}\)。(为了方便描述,我们在下面所说的颜色均为满足恰好出现 \(S\) 次的颜色)。
那么,一个恰好有 \(x\) 种颜色的方案对答案的贡献应该为
(我们先只考虑颜色种数恰好为 \(k\) 的)
\(g_{x} = [x = k] = \sum_{i = 0}^{x}\binom{x}{i}f_{i}\)
(\(f_{i}\) 为容斥系数)
二项式反演,得
\(f_{x} = \binom{k}{x} * (-1) ^ {k - x}\)
所以令 \(B_{x}\) 为恰好 \(x\) 种颜色的方案数,有:
\(B_{x} = \sum_{i = 0}^{m}\binom{m}{i}*A_{i}*\binom{i}{x}*(-1)^{i - x}\)
由于有 \(m\) 个\(B_{x}\) 要求值,且明显的给了一个NTT模数,
考虑转化成卷积的形式:
(把与各种变量相关的尽量整理到一起)
得到:\(B_{x} = \frac{(-1)^{-x}}{x!}\sum_{i = 0}^{m}\frac{\binom{m}{i}*(-1)^{i}}{(i - x)!}\)
前面的是个常数,后面的是一个卷积(把 \(i - x\) 先 \(+ m\) 再反转(防止爆负))……上NTT就好了。
但这还没完!预处理逆元、阶乘逆元、阶乘的话会容易TLE!所以应该快速幂暴力处理逆元……(;′⌒`)
#include <bits/stdc++.h>
using namespace std;
#define maxn 10000005
#define mod 1004535809
#define int long long
int n, m, M, S, W[maxn], G[maxn], a[maxn], b[maxn], c[maxn];
int ans, K, fac[maxn], A[maxn], B[maxn];
int lim = , len, rev[maxn]; int read()
{
int x = , k = ;
char c; c = getchar();
while(c < '' || c > '') { if(c == '-') k = -; c = getchar(); }
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * k;
} int Up(int x) { if(x >= mod) x -= mod; return x; }
int Down(int x) { if(x < ) x += mod; return x; }
int Mod(int x) { x %= mod; if(x < ) x += mod; return x; }
int Qpow(int x, int timer)
{
int base = ;
for(; timer; timer >>= , x = x * x % mod)
if(timer & ) base = x * base % mod;
return base;
}
#define inv(x) Qpow(x, mod - 2) int C(int n, int m)
{
if(n < m || n < || m < ) return ;
int t = fac[n] * inv(fac[m]) % mod * inv(fac[n - m]) % mod;
return t;
} void init()
{
fac[] = ;
int t = max(n, m);
for(int i = ; i <= t; i ++) fac[i] = fac[i - ] * i % mod;
} void Pre()
{
for(int i = ; i <= m; i ++)
{
if(S * i > n) break;
int t = S * i, t1 = C(n, t) * fac[t] % mod;
A[i] = t1 * Qpow(inv(fac[S]), i) % mod * Qpow(m - i, n - t) % mod;
}
for(int i = ; i <= m; i ++)
a[i] = C(m, i) * A[i] % mod * fac[i] % mod * Qpow(-, i) % mod;
for(int i = -m; i <= m; i ++) c[i + K] = i < ? : inv(fac[i]);
for(int i = ; i <= M; i ++) b[i] = c[M - i];
} void NTT(int *A, int opt)
{
int t = opt < ? Qpow(, mod - ) : ;
for(int i = ; i < lim; i ++)
if(i < rev[i]) swap(A[i], A[rev[i]]); for(int l = ; l < lim; l <<= )
{
int g = Qpow(t, (mod - ) / (l << ));
for(int i = ; i < l; i ++) G[i] = 1ll * G[i - ] * g % mod;
for(int i = ; i < lim; i += (l << ))
for(int j = i; j <= i + l - ; j ++)
{
int x = A[j], y = 1ll * G[j - i] * A[j + l] % mod;
A[j] = Up(x + y); A[j + l] = Down(x - y);
}
}
} signed main()
{
n = read(), m = read(), S = read(); K = m, M = m * + ;
for(int i = ; i <= m; i ++) W[i] = read();
init(), Pre(); G[] = ;
while(lim <= M + m) lim <<= , len ++;
for(int i = ; i < lim; i ++)
rev[i] = (rev[i >> ] >> ) | ((i & ) << ((len - )));
NTT(a, ), NTT(b, );
for(int i = ; i < lim; i ++) a[i] = a[i] * b[i] % mod;
NTT(a, -); int inv1 = Qpow(lim, mod - );
for(int i = ; i <= m; i ++)
{
int t = ((i & ) ? - : ) * inv(fac[i]) % mod * W[i] % mod;
ans = Mod(ans + a[i + m + ] * inv1 % mod * t % mod);
}
printf("%lld\n", ans);
return ;
}
【题解】HAOI2018染色的更多相关文章
- 【题解】[HAOI2018]染色(NTT+容斥/二项式反演)
[题解][HAOI2018]染色(NTT+容斥/二项式反演) 可以直接写出式子: \[ f(x)={m \choose x}n!{(\dfrac 1 {(Sx)!})}^x(m-x)^{n-Sx}\d ...
- [洛谷P4491] [HAOI2018]染色
洛谷题目链接:[HAOI2018]染色 题目背景 HAOI2018 Round2 第二题 题目描述 为了报答小 C 的苹果, 小 G 打算送给热爱美术的小 C 一块画布, 这块画布可 以抽象为一个长度 ...
- 【LG4491】[HAOI2018]染色
[LG4491][HAOI2018]染色 题面 洛谷 题解 颜色的数量不超过\(lim=min(m,\frac nS)\) 考虑容斥,计算恰好出现\(S\)次的颜色至少\(i\)种的方案数\(f[i] ...
- 题解-HAOI2018全套
去冬令营转了一圈发现自己比别人差根源在于刷题少,见过的套路少(>ω<) 于是闲来无事把历年省选题做了一些 链接放的都是洛谷的,bz偷懒放的也是链接 AM.T1 奇怪的背包 Problem ...
- BZOJ 5306 [HAOI2018] 染色
BZOJ 5306 [HAOI2018] 染色 首先,求出$N$个位置,出现次数恰好为$S$的颜色至少有$K$种. 方案数显然为$a_i=\frac{n!\times (m-i)^{m-i\times ...
- 【BZOJ5306】 [Haoi2018]染色
BZOJ5306 [Haoi2018]染色 Solution xzz的博客 代码实现 #include<stdio.h> #include<stdlib.h> #include ...
- [BZOJ5306] [HAOI2018]染色(容斥原理+NTT)
[BZOJ5306] [HAOI2018]染色(容斥原理+NTT) 题面 一个长度为 n的序列, 每个位置都可以被染成 m种颜色中的某一种. 如果n个位置中恰好出现了 S次的颜色有 K种, 则小 C ...
- [题解 LuoguP4491 [HAOI2018]染色
传送门 神仙计数题 Orz 先令\(F[k]\)表示出现次数恰好为\(S\)次的颜色恰好有\(k\)中的方案数,那么 \[Ans=\sum\limits_{i=0}^mW_iF[i]\] 怎么求\(F ...
- 【BZOJ5306】[HAOI2018]染色(NTT)
[BZOJ5306]染色(NTT) 题面 BZOJ 洛谷 题解 我们只需要考虑每一个\(W[i]\)的贡献就好了 令\(lim=min(M,\frac{N}{S})\) 那么,开始考虑每一个\(W[i ...
随机推荐
- 结对测试 vs 随机测试
在接口测试过程中,最关键的是对参数的各种情况进行测试. 随机测试是指随机选择一些参数值来测. 结对测试是指parewise算法生成较高“性价比”的组合情况来测. 随机测试存在的问题 随机,这两个字本身 ...
- c语言数字图像处理(十):阈值处理
定义 全局阈值处理 假设某一副灰度图有如下的直方图,该图像由暗色背景下的较亮物体组成,从背景中提取这一物体时,将阈值T作为分割点,分割后的图像g(x, y)由下述公式给出,称为全局阈值处理 多阈值处理 ...
- NAT概念解释(不完全版,但不会搞错...)
NAT在计算器网络中,网络地址转换(Network Address Translation,缩写为NAT),也叫做网络掩蔽或者IP掩蔽(IP masquerading)是一种IP数据包在通过路由器或防 ...
- xml解析数据信息并实现DBManager操作mysql
先前一直都是用的直接用加载驱动 然后创建连接进行操作数据 如果我的数据库换了 那么要修改的地方也比较多 不利于维护 所以就想到了将所有配置连接信息都用xml封装起来 以至于我每次都只要修改一下我的 ...
- 推荐3个小程序开源组件库——Vant、iView、ColorUI
推荐3个小程序开源组件库 在进行小程序开发时,经常会遇到编写组件方面的阻碍,这让我们花费大量的时间在页面以及 CSS 样式编写上.因此可以使用开源组件库,有些复杂的组件可以直接拿来使用,节省开发时间, ...
- c++ 使用this指针进行串联的函数调用
如代码所示,在每个成员函数函数体最后返回*this.即可实现串联调用. class Time { public: Time(, , ); Time &setHour(int); Time &a ...
- Metasploit漏洞利用,三个入侵主机实战案例
受害者主机 windows2003 ie模拟工具ietest ie5.5/6/7/ 漏洞:MS10_002,MS10_018,MS12-020 ---------------------------- ...
- Metasploit拿Shell
进入metasploit系统 msfconsole Nmap端口扫描 nmap –sV IP(或者域名),如果机器设置有防火墙禁ping,可以使用nmap -P0(或者-Pn) –sV IP(或者域名 ...
- 字符串匹配:KMP算法, Boyer-Moore算法理解与总结
1. KMP算法是前缀匹配算法,一次从前往后匹配的过程中,根据已经部分匹配的信息,在文本中,移动尽可能远的距离.而不是按照朴素模式匹配方法,每次都只移动一个位置. 比如这个示例,在文本串中从4(从0开 ...
- TIME_WAIT 你好!
[root@vm-10-124-66-212 ~]# netstat -an|awk -F ' ' '{print $NF}'|sort |uniq -c |sort -rn|more 5552 TI ...