给定长度为 $n$ 的序列, 每个位置都可以被染成 $m$ 种颜色中的某一种. 如果恰好出现了 $s$ 次的颜色有 $k$ 种, 则会产生 $w_{k}$ 的价值. 求对于所有可能的染色方案,获得价值和对 $1004535809$ 取模的结果.

设 $lim=min(m,\frac{n}{s})$,即最大可能的颜色出现种类.
按照套路,令 $f[i]$ 表示钦定 $i$ 种长度为 $s$ 出现的方案数,$g[i]$ 表示恰好 $i$ 种出现的方案数.
$f[k]=\binom{m}{k}\frac{n!}{(n-ks)!(s!)^k}(m-k)^{n-ks}$
组合意义就是选 $ks$ 个位置放出现次数为 $s$ 的颜色,然后其余部分随便放.
而 $g[k]=\sum_{i=k}^{lim}\binom{i}{k}(-1)^{i-k}f[i]$
因为我们要算贡献,所以要求 $g[1]....g[lim]$ ,而上面的式子是 $O(lim^2)$ 的.
考虑优化:
将上面 $\binom{i}{k}$ 展开,得 $g[k]=\frac{1}{k!}\sum_{i=k}^{lim} \frac{(-1)^{i-k}}{(i-k)!}f[i]\times i!$
令 $a[i]=\frac{(-1)^i}{i!}$,$b[i]=f[i]\times i!$ ,则 $g[k]=\frac{1}{k!}\sum_{i=k}^{lim} a[i-k]\times b[i]$
这是一个标准的卷积形式!
直接用 NTT 加速即可.

code:

#include <bits/stdc++.h>
#define N 800005
#define LL long long
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
const LL G=3;
const LL mod=1004535809;
LL A[N],B[N],Ct[N],f[N],g[N],fac[10000008],inv[10000007],val[N];
LL qpow(LL x,LL y)
{
LL tmp=1ll;
for(;y;y>>=1,x=x*x%mod)
if(y&1)
tmp=tmp*x%mod;
return tmp;
}
LL Inv(LL x) { return qpow(x,mod-2); }
void NTT(LL *a,int n,int flag)
{
int i,j,k,mid;
for(i=k=0;i<n;++i)
{
if(i>k) swap(a[i],a[k]);
for(j=n>>1;(k^=j)<j;j>>=1);
}
for(mid=1;mid<n;mid<<=1)
{
LL wn=qpow(G,(mod-1)/(mid<<1));
if(flag==-1) wn=Inv(wn);
for(i=0;i<n;i+=(mid<<1))
{
LL w=1ll;
for(j=0;j<mid;++j)
{
LL x=a[i+j],y=w*a[i+mid+j]%mod;
a[i+j]=(x+y)%mod,a[i+j+mid]=(x-y+mod)%mod;
w=w*wn%mod;
}
}
}
if(flag==-1)
{
LL re=Inv(n);
for(i=0;i<n;++i) a[i]=a[i]*re%mod;
}
}
LL C(int x,int y) { return fac[x]*inv[y]%mod*inv[x-y]%mod; }
int main()
{
// setIO("input");
int n,m,s,i,j,lim;
scanf("%d%d%d",&n,&m,&s);
for(i=0;i<=m;++i) scanf("%lld",&val[i]);
lim=min(m,n/s);
inv[0]=fac[0]=1ll;
int pp=max(n,m);
for(i=1;i<=pp;++i)
{
fac[i]=fac[i-1]*1ll*i%mod;
}
inv[max(n,m)]=qpow(fac[max(n,m)],mod-2);
for(i=max(n,m)-1;i>=0;i--) inv[i]=inv[i+1]*(i+1)%mod;
for(i=0;i<=lim;++i)
{
f[i]=C(m,i)*fac[n]%mod*inv[n-i*s]%mod*qpow(inv[s],i)%mod*qpow(m-i,n-i*s)%mod*fac[i]%mod;
}
for(i=0;i<=lim;++i) A[i]=(inv[i]*(i&1?-1:1)+mod)%mod;
for(i=0;i<=lim;++i) B[lim-i]=f[i];
LL ans=0ll;
int tmp=1;
while(tmp<=lim*2) tmp<<=1;
NTT(A,tmp,1),NTT(B,tmp,1);
for(i=0;i<tmp;++i) Ct[i]=A[i]*B[i]%mod;
NTT(Ct,tmp,-1);
for(i=0;i<=lim;++i) g[i]=Ct[lim-i]*inv[i]%mod;
for(i=0;i<=lim;++i)
{
(ans+=g[i]*val[i]%mod)%=mod;
}
printf("%lld\n",ans);
return 0;
}

  

BZOJ 5306: [Haoi2018]染色 二项式反演+NTT的更多相关文章

  1. BZOJ 5306 [HAOI2018] 染色

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

  2. Codeforces 923E - Perpetual Subtraction(微积分+生成函数+推式子+二项式反演+NTT)

    Codeforces 题目传送门 & 洛谷题目传送门 神仙题 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 首先考虑最朴素的 \(dp\),设 \(dp_{z,i}\) 表示经 ...

  3. BZOJ 2839: 集合计数(二项式反演)

    传送门 解题思路 设\(f(k)\)为交集元素个数为\(k\)的方案数.发现我们并不能直接求出\(f(k)\),就考虑容斥之类的东西,容斥首先要扩大限制,再设\(g(k)\)表示至少有\(k\)个交集 ...

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

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

  5. BZOJ5306 HAOI2018染色(容斥原理+NTT)

    容易想到枚举恰好出现S次的颜色有几种.如果固定至少有i种恰好出现S次,那么方案数是C(M,i)·C(N,i*S)·(M-i)N-i*S·(i*S)!/(S!)i,设为f(i). 于是考虑容斥,可得恰好 ...

  6. bzoj 2839 集合计数 —— 二项式反演

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2839 设 \( f(i) \) 为至少 \( i \) 个选择,则 \( f(i) = C_ ...

  7. bzoj 2839 集合计数——二项式反演

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2839 设 \( g(i) \) 表示至少有 i 个, \( f(i) \) 表示恰好有 i ...

  8. LOJ3120 CTS2019 珍珠 生成函数、二项式反演、NTT

    传送门 题目大意:给出一个长度为\(n\)的序列\(a_i\),序列中每一个数可以取\(1\)到\(D\)中的所有数.问共有多少个序列满足:设\(p_i\)表示第\(i\)个数在序列中出现的次数,\( ...

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

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

随机推荐

  1. 基准测试工具:Wrk初识

    最近和同事聊起常用的一些压测工具,谈到了Apache ab.阿里云的PTS.Jmeter.Locust以及wrk各自的一些优缺点和适用的场景类型. 这篇博客,简单介绍下HTTP基准测试工具wrk的基本 ...

  2. quota - linux磁盘配额管理

    磁盘管理系列 linux磁盘管理系列一:磁盘配额管理   http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_linux_040_quota.html l ...

  3. 【转载】UiPath,UiPath教程,UiPath视频教程 RPA

    第一课-UiPath简介 第二课-变量和数据类型第1部分-基础讲解 第二课-变量和数据类型第2部分-实例讲解 第二课-流程控制第1部分-ifelse语句讲解 第二课-流程控制第3部分-高级流程控制语句 ...

  4. ajxa和axios的区别

    1.axios 原理还是属于 XMLHttpRequest, 因此需要实现一个ajax. 2.但还会需要一个promise对象来对结果进行处理.3.ajax实现var Ajax={ get: func ...

  5. Django 中自定义 Admin 样式与功能

    目录 自定义 Admin 样式与功能 1 页面修改中文 1.1 语言设置为中文 1.2 应用管理设置为中文 1.3 数据库表设置为中文 1.4 数据库表字段名称修改为中文 2 修改后台样式 2.1 安 ...

  6. JavaScript 之 节点操作

    一.文档树结构 DOM 可以将任何 HTML 或 XML 描绘成一个由多层节点构成的结构. 节点分为不同的类型,每种类型分别表示文档中不同的信息.每个节点都拥有各自的特点.数据和方法,另外也与其他节点 ...

  7. Prometheus学习

    简介 Prometheus 最初是 SoundCloud 构建的开源系统监控和报警工具,是一个独立的开源项目,于2016年加入了 CNCF 基金会,作为继 Kubernetes 之后的第二个托管项目. ...

  8. 在线java堆栈分析工具

    1:工具地址  https://gceasy.io/ft-dashboard-web.jsp 2:在线分析结果       

  9. Linux添加用户并赋予root权限

    新增用户 创建一个名为qiang,其家目录位于/usr/qiang的用户 adduser -d /usr/qiang -m qiang 或直接这样,则用户的家目录会默认为/home/目录 adduse ...

  10. JAVA Coder 的《深入分析Java Web 技术内幕》读书笔记

    本文基于<深入分析Java Web 技术内幕> <深入分析Java Web 技术内幕>,作者是 许令波,电子工业出版社.本文只是记录书本当中的精彩部分,作个人回顾和技术分享,请 ...