第一眼肯定想到容斥。设 \(G(k)\) 表示至少有 \(k\) 种颜色符合要求,\(F(k)\) 表示恰好有 \(k\) 种颜色符合要求。显然 \(k\) 的上界 \(t=\min(m,\lfloor\frac ns\rfloor)\),那么就有:

\[G(k)=C_{m}^{k}(k!\prod_{i=0}^{k-1}C_{n-is}^{s})(m-k)^{n-ks}
\]
\[=\frac{m!}{k!(m-k)!}k!\frac{n!}{(s!)^k(n-ks)!}(m-k)^{n-ks}
\]
\[=\frac{n!m!(m-k)^{n-ks}}{(s!)^k(n-ks)!(m-k)!}
\]
\[F(k)=\sum_{i=k}^t(-1)^{i-k}C_i^kG(i)
\]
\[=\frac 1{k!}\sum_{i=k}^t\frac{(-1)^{i-k}}{(i-k)!}i!G(i)
\]

不妨设 \(a_i=\dfrac{(-1)^i}{i!},b_i=i!G(i)\),则有:

\[k!F(k)=\sum_{i=k}^ta_{i-k}b_i
\]

同 快速傅立叶之二 一题,直接 NTT 即可。

时间复杂度 \(O(m\log m+n)\),不预处理逆元更快。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=4e5+5,p=1004535809;
namespace NTT{
int rev[N],mx,k,qp;
struct dft{int fg[N];};
int qpow(int x,int y){
int re=1;
while(y){
if(y&1) re=re*x%p;
x=x*x%p,y>>=1;
}return re;
}void init(int n){
n=n*2+1,mx=1,k=0,rev[0]=0;
while(mx<=n) mx*=2,k++;
for(int i=0;i<mx;i++)
rev[i]=(rev[i>>1]>>1)|((i&1)<<(k-1));
qp=qpow(mx,p-2);
}void ntt(dft &a,int fl){
for(int i=0;i<mx;i++)
if(i<rev[i]) swap(a.fg[i],a.fg[rev[i]]);
for(int i=1;i<mx;i*=2){
int om=qpow(fl?3:(p+1)/3,(p-1)/(i<<1));
for(int j=0,w=1;j<mx;j+=i*2,w=1)
for(int k=j;k<j+i;k++,w=w*om%p){
int x=a.fg[k],y=w*a.fg[k+i]%p;
a.fg[k]=(x+y)%p,a.fg[k+i]=(x-y+p)%p;
}
}if(fl) return;
for(int i=0;i<mx;i++)
a.fg[i]=a.fg[i]*qp%p;
}
}using namespace NTT;
int n,m,s,t,w[N],jc[N*25];dft f,g;
signed main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>m>>s,init(t=min(n/s,m)),jc[0]=1;
for(int i=1;i<=max({m,n,s});i++) jc[i]=jc[i-1]*i%p;
for(int i=0;i<=m;i++) cin>>w[i];
for(int i=0;i<=t;i++){
int h=qpow(jc[n-i*s]*jc[m-i]%p,p-2);
h=h*jc[m]%p*jc[n]%p*qpow(m-i,n-i*s);
f.fg[i]=h%p*qpow(jc[s],(i*p-i-i)%(p-1))%p;
g.fg[t-i]=(i%2?-1:1)*qpow(jc[i],p-2);
}ntt(f,1),ntt(g,1);
for(int i=0;i<mx;i++)
f.fg[i]=f.fg[i]*g.fg[i]%p;
ntt(f,0);int sum=0;
for(int i=0;i<=t;i++)
sum=(sum+w[i]*qpow(jc[i],p-2)%p*f.fg[t+i])%p;
cout<<sum;
return 0;
}

[HAOI2018] 染色 题解的更多相关文章

  1. 【题解】[HAOI2018]染色(NTT+容斥/二项式反演)

    [题解][HAOI2018]染色(NTT+容斥/二项式反演) 可以直接写出式子: \[ f(x)={m \choose x}n!{(\dfrac 1 {(Sx)!})}^x(m-x)^{n-Sx}\d ...

  2. [洛谷P4491] [HAOI2018]染色

    洛谷题目链接:[HAOI2018]染色 题目背景 HAOI2018 Round2 第二题 题目描述 为了报答小 C 的苹果, 小 G 打算送给热爱美术的小 C 一块画布, 这块画布可 以抽象为一个长度 ...

  3. 【LG4491】[HAOI2018]染色

    [LG4491][HAOI2018]染色 题面 洛谷 题解 颜色的数量不超过\(lim=min(m,\frac nS)\) 考虑容斥,计算恰好出现\(S\)次的颜色至少\(i\)种的方案数\(f[i] ...

  4. BZOJ 5306 [HAOI2018] 染色

    BZOJ 5306 [HAOI2018] 染色 首先,求出$N$个位置,出现次数恰好为$S$的颜色至少有$K$种. 方案数显然为$a_i=\frac{n!\times (m-i)^{m-i\times ...

  5. 【BZOJ5306】 [Haoi2018]染色

    BZOJ5306 [Haoi2018]染色 Solution xzz的博客 代码实现 #include<stdio.h> #include<stdlib.h> #include ...

  6. [BZOJ5306] [HAOI2018]染色(容斥原理+NTT)

    [BZOJ5306] [HAOI2018]染色(容斥原理+NTT) 题面 一个长度为 n的序列, 每个位置都可以被染成 m种颜色中的某一种. 如果n个位置中恰好出现了 S次的颜色有 K种, 则小 C ...

  7. BZOJ 4033: [HAOI2015]树上染色题解

    BZOJ 4033: [HAOI2015]树上染色题解(树形dp) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1327400 原题地址: BZOJ 403 ...

  8. [题解 LuoguP4491 [HAOI2018]染色

    传送门 神仙计数题 Orz 先令\(F[k]\)表示出现次数恰好为\(S\)次的颜色恰好有\(k\)中的方案数,那么 \[Ans=\sum\limits_{i=0}^mW_iF[i]\] 怎么求\(F ...

  9. 【题解】HAOI2018染色

    好坑啊不开心…… 其实这题的想法还是比较简单粗暴的.题目明示恰好xxx,显然排除斜率二分这个玩意儿,那么不就只剩下容斥了嘛…… 令 \(A_{x}\) 为恰好出现了 \(S\) 次的至少有 \(x\) ...

  10. HAOI2018 简要题解

    这套题是 dy, wearry 出的.学长好强啊,可惜都 \(wc\) 退役了.. 话说 wearry 真的是一个计数神仙..就没看到他计不出来的题...每次考他模拟赛总有一两道毒瘤计数TAT 上午的 ...

随机推荐

  1. 【VMware VCF】管理 VCF 环境中组件的密码策略。

    使用 SDDC Manager 中的"密码管理"功能可以统一管理 VCF 环境中组件的用户密码,比如更新(Update).轮换(Rotate)以及修复(Remediate)组件的密 ...

  2. sqlserver查询某数据库下表的占用空间

    要查看 SQL Server 中哪个表占用的空间最多,您可以使用以下查询来列出所有表及其占用的空间大小,并按照占用空间从大到小进行排序: SELECT t.NAME AS TableName, p.r ...

  3. 12C++循环结构-for循环(2)——教学

    一.循环变量为字符型 (第32课 26个兄弟姐妹)参考视频1 试编一程序,按字典顺序输出26个字母. 流程图: 思考:先顺序输出26个小写英文字母,再逆序输出26个大写英文字母. 循环可以是递增型循环 ...

  4. vue3 重置reactive数据

    有一个formData数据字段,使用class创建一份初始数据与其对应,使用Object.assign进行重置 import { reactive } from 'vue' class InitFor ...

  5. 【SpringMVC】获取请求参数的方式

    SpringMVC获取请求参数的方式 目录 SpringMVC获取请求参数的方式 方式1:ServletAPI 方法2:通过控制器方法的形参获取请求参数 方法3:@RequestParam 方法4:@ ...

  6. Windows 11 下 Virtualbox 6.1.34 出现 End kernel panic - not syncing: attempted to kill the idle task

    前言小半年没用 Virtualbox 了,切换到了 VMware,今天又切换回去(无聊),但是安装虚拟机出现这个错误. 解决方法根据 Virtualbox 论坛的讨论[1]和[2],首先明确 系统必须 ...

  7. Qt编写项目作品27-多线程文件传输

    一.功能特点 多线程收发文件,支持加密传输. 接收端支持监听端口接收文件和主动连接服务器接收文件两种方式. 按照 文件开始符+文件大小+文件内容+文件结束符 逐个分包接收. 可对接收的加密过的文件包进 ...

  8. vue引入element-ui插件 “export ‘default‘ (imported as ‘Vue‘) was not found in ‘vue‘

    注意:出现该问题的原因主要是使用的Vue版本与Element-UI的版本不匹配. Vue.Vue-cli与Element-UI之间版本的正确的匹配关系是: Vue库版本 Vue-cli库版本 Elem ...

  9. Index - 此处的诗

    虚构往事 正篇   嗯--本来发过两篇,但深愧于仓促的处理和并未完善的细节设定,隐藏了.   大概会是一个中篇的科幻故事,世界设定已经完善了(Shaya 可以作证!),但近期可能没有精力动笔. 番外 ...

  10. Kernel Memory 让 SK 记住更多内容

    Kernel Memory (KM) 是一种多模态 AI 服务,专注于通过自定义的连续数据混合管道高效索引数据集.它支持检索增强生成(RAG).合成记忆.提示工程以及自定义语义记忆处理.KM 支持自然 ...