显然颜色数量不会超过\(lim=\min(m,n/S)\)

考虑容斥,计算恰好出现了\(S\)次的颜色有至少\(i\)种的方案数\(f[i]\),钦定\(i\)种颜色正好放\(S\)种

有\(m\)种颜色选\(i\)种,所以乘一个\(C_m^i\)

然后这n个位置分成\(i+1\)个部分:被钦定的\(i\)种颜色,每个有\(S\)个;剩下的\(m-i\)种颜色,一共\(n-iS\)个。先看作是可重的全排列数,那么方案就有\(\frac{n!}{(S!)^i(n-iS)!}\)种。前\(i\)各部分都是只有一种颜色,后面部分每个有\(m-i\)种取法,所以还有一个\((m-i)^{n-iS}\)

综上,\(f[i]=C_m^i\cdot \frac{n!}{(S!)^i(n-iS)!}\cdot(m-i)^{n-iS}\)

接下来就是答案,恰好出现了\(S\)次的颜色有正好\(i\)种的方案数\(ans[i]\)

用容斥,\(ans[i]=\sum_{j=i}^{lim}(-1)^{j-i}C_j^if[j]\)

那个组合数很麻烦,拆开

\(ans[i]=\sum_{j=i}^{lim}(-1)^{j-i}\frac{j!}{i!(j-i)!}f[j]\)

\(ans[i]\cdot i!=\sum_{j=i}^{lim}\frac{(-1)^{j-i}}{(j-i)!}f[j]\cdot j!\)

这就可以直接用NTT做了,如果不知道怎么做的可以先写zjoi2014 力

#include<bits/stdc++.h>
#define il inline
#define vd void
#define mod 1004535809
typedef long long ll;
il int gi(){
int x=0,f=1;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')f=-1;
ch=getchar();
}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return x*f;
}
il int pow(int x,int y){
int ret=1;
while(y){
if(y&1)ret=1ll*ret*x%mod;
x=1ll*x*x%mod;y>>=1;
}
return ret;
}
#define inv(a) pow((a),mod-2)
const int G=3,iG=inv(G);
int fact[10000001],W[100010];
int A[262147],B[262147],rev[262147];
il int C(int n,int m){
if(n<m)return 0;
return 1ll*fact[n]*inv(1ll*fact[m]*fact[n-m]%mod)%mod;
}
il vd ntt(int*A,int n,int t){
for(int i=0;i<n;++i)if(rev[i]>i)std::swap(A[rev[i]],A[i]);
for(int o=1;o<n;o<<=1){
int W=pow(t?G:iG,(mod-1)/(o<<1));
for(int*p=A;p!=A+n;p+=o<<1)
for(int i=0,w=1;i<o;++i,w=1ll*w*W%mod){
int t=1ll*w*p[i+o]%mod;
p[i+o]=(p[i]-t+mod)%mod,p[i]=(p[i]+t)%mod;
}
}
if(!t){
int invN=inv(n);
for(int i=0;i<n;++i)A[i]=1ll*invN*A[i]%mod;
}
}
int main(){
int n=gi(),m=gi(),s=gi();
for(int i=0;i<=m;++i)W[i]=gi();
int LIM=std::max(m,n);
fact[0]=1;for(int i=1;i<=LIM;++i)fact[i]=1ll*fact[i-1]*i%mod;
int lim=std::min(m,n/s);
int N=1,lg=0;while(N<(lim+1)<<1)N<<=1,++lg;
for(int i=0;i<=lim;++i)A[i]=1ll*fact[i]*C(m,i)%mod*fact[n]%mod*pow(m-i,n-i*s)%mod*inv(1ll*pow(fact[s],i)*fact[n-i*s]%mod)%mod;
for(int i=0;i<=lim;++i){
B[i]=inv(fact[lim-i]);
if((lim-i)&1)B[i]=mod-B[i];
}
for(int i=0;i<N;++i)rev[i]=(rev[i>>1]>>1)|((i&1)<<lg-1);
ntt(A,N,1),ntt(B,N,1);
for(int i=0;i<N;++i)A[i]=1ll*A[i]*B[i]%mod;
ntt(A,N,0);
int ans=0;
for(int i=0;i<=lim;++i)ans=(ans+1ll*W[i]*A[lim+i]%mod*inv(fact[i])%mod)%mod;
printf("%d\n",ans);
return 0;
}

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

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

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

  2. P4491 [HAOI2018]染色

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

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

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

  4. P4491 [HAOI2018]染色 广义容斥 NTT 生成函数

    LINK:染色 算是比较常规的广义容斥. 算恰好k个 可以直接转成至少k个. 至少k个非常的好求 直接生成函数. 设\(g_k\)表示至少有k个颜色是满足的 那么有 \(g_k=C(m,k)\frac ...

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

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

  6. luogu P4491 [HAOI2018]染色

    传送门 这一类题都要考虑推式子 首先推出题目要求的式子,枚举正好有\(s\)个颜色的种类(范围\([0,p=min(\lfloor\frac{n}{s}\rfloor,m)]\)),然后对于后面的颜色 ...

  7. 【LG4491】[HAOI2018]染色

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

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

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

  9. BZOJ 5306 [HAOI2018] 染色

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

随机推荐

  1. IE中操作粘贴板复制和粘贴

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. MySQL crash-safe replication(1)

    MySQL 5.6 对复制功能提供了新特性:slave 支持 crash-safe,可以解决之前版本中系统异常断电可能导致的 SQL thread 信息不准确的问题. 原文:Enabling cras ...

  3. python执行sql语句

    dbname = 'db.sqlite3' dbpath = 'D:\\pyweb\\sf\\db.sqlite3' csvpath = pspath #custom thread number tn ...

  4. Hyper-v UBUNTU 12.04 模板设置

    Ubuntu 12.04 模板设置 参考文档 Hyper-v安装ubuntu http://blogs.msdn.com/b/virtual_pc_guy/archive/2012/05/02/ubu ...

  5. [Spark Core] Spark 实现气温统计

    0. 说明 聚合气温数据,聚合出 MAX . MIN . AVG 1. Spark Shell 实现 1.1 MAX 分步实现 # 加载文档 val rdd1 = sc.textFile(" ...

  6. gl 绘制多边形的函数解析 分类: OpenGL(转)

    http://blog.csdn.net/zhongjling/article/details/7528091 1,所谓正反面 glFrontFace(GL_CCW);  // 设置CCW方向为“正面 ...

  7. yum 私有仓库

    参考地址:https://blog.oldboyedu.com/autodeploy-yum YUM主要用于自动安装.升级rpm软件包,它能自动查找并解决rpm包之间的依赖关系.要成功的使用YUM工具 ...

  8. vc MFC 通过IDispatch调用默认成员函数

    CComPtr<IDispatch> spDisp(IDispatch *); if(!spDisp) return; DISPPARAMS dispParam={0}; //没有参数 V ...

  9. python提示警告InsecureRequestWarning

    在Python3中使用以下代码报错: import requests response = requests.get(url='', verify=False) 错误代码如下: InsecureReq ...

  10. Excel 怎样去掉单元格中的回车符号

    1.同时按下 CTRL+H调出"查找---替换"对话框:2.在查找中输入:按住ALT ,小键盘输入 10 ,然后松开ALT:3.在替换中写入要替换的符号:这样就将回车符换成其他符号 ...