洛谷题目链接:[HAOI2018]染色

题目背景

HAOI2018 Round2 第二题

题目描述

为了报答小 C 的苹果, 小 G 打算送给热爱美术的小 C 一块画布, 这块画布可 以抽象为一个长度为 \(N\) 的序列, 每个位置都可以被染成 \(M\) 种颜色中的某一种.

然而小 C 只关心序列的 \(N\) 个位置中出现次数恰好为 \(S\) 的颜色种数, 如果恰 好出现了 \(S\) 次的颜色有 \(K\) 种, 则小 C 会产生 \(W_k\) 的愉悦度.

小 C 希望知道对于所有可能的染色方案, 他能获得的愉悦度的和对 \(1004535809\) 取模的结果是多少.

输入输出格式

输入格式:

从标准输入读入数据. 第一行三个整数 \(N, M, S\).

接下来一行 \(M + 1\) 个整数, 第 \(i\) 个数表示 \(W_{i-1}\)​ .

输出格式:

输出到标准输出中. 输出一个整数表示答案.

输入输出样例

输入样例#1:

8 8 3

3999 8477 9694 8454 3308 8961 3018 2255 4910

输出样例#1:

524070430

输入样例#2:

https://www.luogu.org/paste/rxrv9utg

输出样例#2:

231524284

说明

特殊性质: \(\forall 1 \le i \le m, W_i = 0\)

对于 \(100\%\) 的数据, 满足 \(0 \le W_i < 1004535809\)

题解: 设\(f[i]\)表示出现次数恰好等于\(S\)的颜色个数大于等于\(i\)的方案数,从\(m\)种颜色中选出\(i\)种颜色的方案是\(C_m^i\),将染色的序列看做一个有可重元素的排列,那么方案数就是$$f[i]=C_mi*\frac{n!}{(n-S*i)!(S!)i}(n-Si)^{m-i}$$

之所以是大于等于,是因为式子的最后面那部分还可能有出现次数恰好等于\(S\)的颜色.

设\(lim=min(\lfloor\frac{n}{s} \rfloor,m)\).

设\(ans[i]\)表示出现次数恰好等于\(S\)的颜色个数恰好等于\(i\)的方案数,根据容斥,有:$$ans[i]=\sum_{j=i}{lim}(-1){j-i}C_j^if[j]$$

将式子中的组合数拆开$$ans[i]i!=\sum_{j=i}{lim}*\frac{(-1){j-i}}{(j-i)!}\frac{f[j]}{j!}$$

可以发现这是一个卷积的形式,设\(A[i]=\frac{(-1)^{i}}{i!},B[i]=\frac{f[i]}{i}\),那么将\(A\)的系数翻转,再与\(B\)做多项式乘法就可以了.

最后在统计答案的时候要注意,因为将\(A\)的系数翻转了,所以求出来的结果相当于是\(C_{i+lim}=A^{'}_{lim+i-j}*B_j\),所以在统计出现\(i\)次的方案数时要将数组的下标加\(lim\).

#include<bits/stdc++.h>
using namespace std;
const int N = 1e7+5;
const int M = 3e5+5;
const int mod = 1004535809; int n, m, s, lim, r[M], len = 0, f[M], ans = 0, w[N], a[N], cnt[N];
int pinv[N], inv[N], fac[N]; void init(int n){
pinv[0] = inv[0] = fac[0] = pinv[1] = inv[1] = fac[1] = 1;
for(int i = 2; i <= n; i++){
fac[i] = 1ll*fac[i-1]*i%mod;
inv[i] = 1ll*(mod-mod/i)*inv[mod%i]%mod;
pinv[i] = 1ll*pinv[i-1]*inv[i]%mod;
}
} int C(int n, int m){ return 1ll*fac[n]*pinv[m]%mod*pinv[n-m]%mod; } int qpow(int x, int n){
int res = 1;
for(; n; x = 1ll*x*x%mod, n >>= 1)
if(n & 1) res = 1ll*res*x%mod;
return res;
} void NTT(int *A, int f){
for(int i = 0; i < n; i++) if(i < r[i]) swap(A[i], A[r[i]]);
for(int i = 1; i < n; i <<= 1){
int wi = qpow(3, (mod-1)/(i << 1)), x, y;
if(f == -1) wi = qpow(wi, mod-2);
for(int j = 0; j < n; j += (i << 1)){
for(int k = 0, w = 1; k < i; k++, w = 1ll*w*wi%mod){
x = A[j+k], y = 1ll*A[i+j+k]*w%mod;
A[j+k] = (x+y)%mod, A[i+j+k] = (x-y+mod)%mod;
}
}
}
if(f == -1){
int invn = qpow(n, mod-2);
for(int i = 0; i < n; i++) A[i] = 1ll*A[i]*invn%mod;
}
} int main(){
ios::sync_with_stdio(false);
cin >> n >> m >> s, lim = min(m, n/s), init(max(n, m));
for(int i = 0; i <= m; i++) cin >> w[i];
for(int i = 0; i <= lim; i++)
cnt[i] = 1ll*fac[n]*qpow(pinv[s], i)%mod*pinv[n-s*i]%mod*C(m, i)%mod*qpow(m-i, n-s*i)%mod*fac[i]%mod;
for(int i = 0; i <= lim; i++) a[i] = (((lim-i)&1) ? (mod-pinv[lim-i]) : pinv[lim-i]);
for(n = 1; n < (lim+1 << 1); n <<= 1) len++;
for(int i = 0; i < n; i++) r[i] = (r[i>>1]>>1)|((i&1)<<len-1);
NTT(cnt, 1), NTT(a, 1);
for(int i = 0; i < n; i++) cnt[i] = 1ll*cnt[i]*a[i]%mod;
NTT(cnt, -1);
for(int i = 0; i <= lim; i++) (ans += 1ll*cnt[lim+i]*pinv[i]%mod*w[i]%mod) %= mod;
cout << ans << endl;
return 0;
}

[洛谷P4491] [HAOI2018]染色的更多相关文章

  1. Solution -「HAOI 2018」「洛谷 P4491」染色

    \(\mathcal{Description}\)   Link.   用 \(m\) 种颜色为长为 \(n\) 的序列染色,每个位置一种颜色.对于一种染色方案,其价值为 \(w(\text{出现恰 ...

  2. 洛咕 P4491 [HAOI2018]染色

    显然颜色数量不会超过\(lim=\min(m,n/S)\) 考虑容斥,计算恰好出现了\(S\)次的颜色有至少\(i\)种的方案数\(f[i]\),钦定\(i\)种颜色正好放\(S\)种 有\(m\)种 ...

  3. BZOJ2243 洛谷2486 [SDOI2011]染色 树链剖分

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ2243 题目传送门 - 洛谷2486 题意概括 一棵树,共n个节点. 让你支持以下两种操作,共m次操 ...

  4. P4491 [HAOI2018]染色

    题目链接:洛谷 题目大意:$n$个位置染$m$种颜色,如果出现次数恰为$S$次的颜色有$k$种,则对答案有$W_k$的贡献,求所有染色方案的答案之和$\bmod 1004535809$. 数据范围:$ ...

  5. [洛谷P4492] [HAOI2018]苹果树

    洛谷题目链接:[HAOI2018]苹果树 题目背景 HAOI2018 Round2 第一题 题目描述 小 C 在自己家的花园里种了一棵苹果树, 树上每个结点都有恰好两个分支. 经过细心的观察, 小 C ...

  6. 洛谷 P3177 树上染色 解题报告

    P3177 [HAOI2015]树上染色 题目描述 有一棵点数为\(N\)的树,树边有边权.给你一个在\(0\) ~ \(N\)之内的正整数\(K\),你要在这棵树中选择\(K\)个点,将其染成黑色, ...

  7. P4491 [HAOI2018]染色 容斥+NTT

    $ \color{#0066ff}{ 题目描述 }$ 为了报答小 C 的苹果, 小 G 打算送给热爱美术的小 C 一块画布, 这块画布可 以抽象为一个长度为 \(N\) 的序列, 每个位置都可以被染成 ...

  8. 洛谷 P4495 [HAOI2018]奇怪的背包 解题报告

    P4495 [HAOI2018]奇怪的背包 题目描述 小\(C\)非常擅长背包问题,他有一个奇怪的背包,这个背包有一个参数\(P\),当他 向这个背包内放入若干个物品后,背包的重量是物品总体积对\(P ...

  9. 洛谷 P2486 [SDOI2011]染色/bzoj 2243: [SDOI2011]染色 解题报告

    [SDOI2011]染色 题目描述 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同 ...

随机推荐

  1. 【CSAPP笔记】11. 存储器层次结构

    在没有专门研究存储器系统之前,我们依赖的存储器模型是一个很简单的概念,也就是把它看成一个线性数组,CPU 能在一个常数时间内访问任何一个存储器位置.虽然在研究别的问题时,这是一个有效的模型,但是它不能 ...

  2. C#简单窗体应用程序(三)

    使用C#创建窗体应用程序的基本步骤: (1)创建项目: (2)用户界面设计: (3)属性设置: (4)编写程序代码: (5)保存.调试.运行: 例题:设计歌曲列表界面,效果如下: 第一步:创建项目: ...

  3. 项目冲刺Beta第三篇博客

    Beta版本冲刺计划安排 1.当天站立式会议照片: 2.工作分工: 团队成员 分工 张洪滨060  排行榜界面美化 陈敬轩059  注册成功界面美化 黄兴067  登录界面美化 林国梽068  答题界 ...

  4. http和https的优缺点,区别与工作原理

    文章内容 超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可 ...

  5. JS选取DOM元素的方法

    摘自JavaScript权威指南(jQuery根据样式选择器查找元素的终极方式是 先用getElementsByTagName(*)获取所有DOM元素,然后根据样式选择器对所有DOM元素进行筛选) 今 ...

  6. 是否升级IOS11?IOS11不支持32位程序 查看手机哪些APP不支持

    查看苹果32位APP具体步骤:设置-通用-关于本机-应用程序.如果手机中下载了32位应用的话,苹果会给出应用兼容性提醒:如果手机里没有安装32位应用,右侧没有小三角,点击“应用程序”也会没有反应. I ...

  7. 加密,解密web.config数据库连接字符串

    "connectionStrings" 路径是web.config所在的工程目录. 1.加密EncryptWebConfig.bat @echo offC:\Windows\Mic ...

  8. 访问控制列表-ACL匹配规则

    1 .ACL匹配机制 首先,小编为大家介绍ACL匹配机制.上一期提到,ACL在匹配报文时遵循“一旦命中即停止匹配”的原则.其实,这句话就是对ACL匹配机制的一个高度的概括.当然,ACL匹配过程中,还存 ...

  9. python使用SMTP发送qq/sina邮件

    python使用qq邮箱(个人邮箱)发送邮件需开启qq邮箱的SMTP服务 在设置中开启pop3/SMTP服务,返回的密码就是之后代码中登录使用账户密码(在完整代码中标识了出来) 之后出现如下错误 sm ...

  10. THUWC2017随机二分图

    题面链接 洛谷 sol 唯一的重点是拆边... 0的不管,只看1.2. 先无论如何把两条边的边权赋为\(0.5\)然后我们发现如果两个都选了. 对于第一种边,我们发现如果\(\frac{1}{2} * ...