[HAOI2018]染色

题目描述

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

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

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

题解

碰到这种等于什么什么的题要考虑容斥。

既然是容斥,那么先设cnt[i]表示至少有i种出现了s次的颜色的方案数。

这个可以直接算,先C(m,i)选颜色,然后每种颜色的s种看做一个整体,其余的n-i*s看做一个整体,算一下排列n!/((s!)i*(n-s*i)!)先求一下排列数。

然后剩下的n-s*i个位置可以随便填m-i种颜色,乘上(m-i)n-s*i就可以了。

然后继续容斥。

ans[k]=∑(-1)i-kC(i,k)*cnt[i]

然后我们把组合数拆开,用FFT优化就好了。

不过我们发现它的卷积是个反着的,把其中一个数组reverse一下就好了。

代码

#include<iostream>
#include<cstdio>
#define N 10000009
#define M 100009
using namespace std;
typedef long long ll;
const int mod=1004535809;
const int Gi=334845270;
const int G=3;
ll n,m,jie[N],ni[N],a[M<<2],val[M<<2],w[M],s,b[M<<2],l,L,rev[M<<2],ans;
inline int rd(){
    ll x=0;char c=getchar();bool f=0;
    while(!isdigit(c)){if(c==‘-‘)f=1;c=getchar();}
    while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
    return f?-x:x;
}
inline ll power(ll x,ll y){
    ll ans=1;
    while(y){if(y&1)ans=ans*x%mod;x=x*x%mod;y>>=1;}
    return ans;
}
inline ll ny(ll x){return power(x,mod-2);}
inline ll C(int n,int m){return jie[n]*ni[m]%mod*ni[n-m]%mod;}
inline void NTT(ll *a,int tag){
    for(int i=1;i<l;++i)if(i>rev[i])swap(a[i],a[rev[i]]);
    for(int i=1;i<l;i<<=1){
        ll wn=power(tag==1?G:Gi,(mod-1)/(i<<1));
        for(int j=0;j<l;j+=(i<<1)){
            ll w=1;
            for(int k=0;k<i;++k,w=w*wn%mod){
                ll x=a[k+j],y=a[i+j+k]*w%mod;
                a[k+j]=(x+y)%mod;a[i+j+k]=(x-y+mod)%mod;
            }
        }
    }
}
int main(){
    n=rd();m=rd();s=rd();int num=max(n,m);
    for(int i=0;i<=m;++i)w[i]=rd();
    jie[0]=1;
    for(int i=1;i<=num;++i)jie[i]=jie[i-1]*i%mod;ni[num]=power(jie[num],mod-2);
    for(int i=num-1;i>=0;--i)ni[i]=ni[i+1]*(i+1)%mod;
    for(int i=0;i<=m;++i)if(n-i*s>=0){
        val[i]=C(m,i)*jie[n]%mod*power(ni[s],i)%mod*ni[n-s*i]%mod*power(m-i,n-s*i)%mod;
    }
    for(int i=0;i<=m;++i){
      a[m-i]=jie[i]*val[i];
      b[i]=ni[i];if(i&1)b[i]=(-b[i]+mod)%mod;
    }
    l=1;L=0;
    while(l<=(m<<1))l<<=1,L++;
    for(int i=1;i<l;++i)rev[i]=(rev[i>>1]>>1)|((i&1)<<(L-1));
    NTT(a,1);NTT(b,1);
    for(int i=0;i<l;++i)a[i]=a[i]*b[i]%mod;
    NTT(a,-1);int nn=power(l,mod-2);
    for(int i=0;i<l;++i)a[i]=a[i]*nn%mod;
    for(int i=0;i<=m;++i)(ans+=a[m-i]*w[i]%mod*ni[i]%mod)%=mod;
    cout<<ans;
    return 0;
}

原文地址:https://www.cnblogs.com/ZH-comld/p/10279712.html

时间: 2024-08-30 17:57:38

[HAOI2018]染色的相关文章

bzoj 5306 [HAOI2018] 染色

bzoj 5306 [HAOI2018] 染色 链接 推式子题 首先枚举有几种颜色选择恰好 \(s\) 次,可以得到一个式子: \[\sum _{i = 0} ^ {\min(\frac n s,m )} \frac {\binom n {i \cdot s} \binom m i (i \cdot s) ! \cdot f_i \cdot (m-i)^{n - is}} {(s!) ^ i} \] 但是,\(f_i\) 不能单纯地等于 \(w_i\), 因为会重复计算,我们不能保证当前选择的

HAOI2018 [HAOI2018]染色 【组合数 + 容斥 + NTT】

题目 为了报答小 C 的苹果, 小 G 打算送给热爱美术的小 C 一块画布, 这块画布可 以抽象为一个长度为 \(N\) 的序列, 每个位置都可以被染成 \(M\) 种颜色中的某一种. 然而小 C 只关心序列的 \(N\) 个位置中出现次数恰好为 \(S\) 的颜色种数, 如果恰 好出现了 \(S\) 次的颜色有 \(K\) 种, 则小 C 会产生 \(W_k\) 的愉悦度. 小 C 希望知道对于所有可能的染色方案, 他能获得的愉悦度的和对 1004535809 取模的结果是多少. 输入格式 从

P4491 [HAOI2018]染色

传送门 我觉得自己的数学也是够差的--一点思路也没有-- 考虑容斥,首先\(lim=min(m,n/S)\),设\(f[i]\)表示出现恰好\(S\)次的元素大于等于\(i\)种的情况,我们随便选\(i\)种颜色放\(S\)次,选的方法数有\(C_m^i\)种,然后染色可以看做是一个类似全排列的东西,每连续的几个染上同样的颜色,那么方案数为\(\frac{n!}{(S!)^i(n-S*i)!}\),前面颜色已经选定了,后面的每个有\(m-i\)种颜色可选,所以还要乘上一个\((m-i)^{n-S

luogu P4491 [HAOI2018]染色

传送门 这一类题都要考虑推式子 首先推出题目要求的式子,枚举正好有\(s\)个颜色的种类(范围\([0,p=min(\lfloor\frac{n}{s}\rfloor,m)]\)),然后对于后面的颜色可能也有数量为\(s\)的,容斥一下即可,即\[ans=\sum_{k=0}^{p}w_k*\binom{m}{k}*\binom{n}{ks}*\frac{(ks)!}{(s!)^k}\sum_{i=0}^{p-k}(-1)^i*\binom{m-k}{i}*\binom{n-ks}{is}*\f

luoguP4491 [HAOI2018]染色 广义容斥原理 + FFT

非常明显的摆了一个NTT模数.... 题目中求恰好\(k\),那么考虑求至少\(k\) 记\(g(k)\)表示至少\(k\)中颜色出现了恰好\(S\)次 那么,\[g(k) = \binom{M}{k} \frac{N!}{(S!)^k (N-Sk)!} * (M-k)^{N-Sk}\] 根据广义容斥原理,记\(f(i)\)表示恰好\(k\)种颜色出现了恰好\(k\)次 那么,\[f(i) = \sum \limits_{k = i}^M (-1)^{k - i} \binom{k}{i} g(

HAOI2018染色——容斥

题目大意 loj 思路 设\(f_i\)表示至少出现了i种颜色的方案数 \[ \begin{aligned} f_i&={m \choose i}\times \frac{(s\times i)!}{(s!)^{i}}\times {n\choose s\times i}\times (m-i)^{n-s\times i}\f_i&={m \choose i}\times \frac{n!}{(s!)^{i}\times (n-s\times i)!}\times (m-i)^{n-s\t

[HAOI2018][bzoj5306] 染色 [容斥原理+NTT]

广告 蒟蒻のblog 思路 这道题的核心在于"恰好有\(k\)种颜色占了恰好\(s\)个格子" 这些"恰好",引导我们去思考,怎么求出总的方案数呢? 分开考虑 考虑把恰好有\(s\)个格子的颜色,和不是\(s\)个颜色的格子分开来考虑 那么,显然答案可以用这样的一个式子表示: 令\(lim=min(\lfloor\frac ns\rfloor,m)\),那么: \(ans=\sum_{i=0}^{lim}w_iC_m^iC_n^{is}\frac{(is)!}{(s

「HAOI2018」染色

题目链接:Click here Solution: 看到恰好,首先考虑容斥,设\(f[i]\)表示我们钦定\(i\)种颜色在序列中恰好出现了\(S\)次有多少种方案 那么现在就有\(i+1\)个部分,把他看作是可重集的全排列,方案数即 \({n! \over (S!)^i (n-Si)}\) ,后面每个都可以选 \((m-i)\) 种颜色 那么\(f[i]\)就是这样算的: \[ f[i]={m\choose i}\times {n! \over (S!)^i (n-Si)!} \times (

HAOI2018 简要题解

这套题是 dy, wearry 出的.学长好强啊,可惜都 \(wc\) 退役了.. 话说 wearry 真的是一个计数神仙..就没看到他计不出来的题...每次考他模拟赛总有一两道毒瘤计数TAT 上午的官方题解可以看 dy0607 的博客,写的挺详细的. 「HAOI2018」奇怪的背包 题意 小C非常擅长背包问题,他有一个奇怪的背包,这个背包有一个参数 \(P\) ,当他向这个背包内放入若干个物品后,背包的重量是物品总体积对 \(P\) 取模后的结果. 现在小C有 \(n\) 种体积不同的物品,第