「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 (m-i)^{n-Si}
\]
现在我们来考虑容斥,\(ans[i]\)表示恰好有\(i\)种颜色在序列中出现了恰好\(S\)次的方案,式子前乘的\({j\choose i}\)代表钦定的颜色选取方案
\[
ans[i]=\sum_{j=i}^{lim} (-1)^{j-i}{j\choose i} f[j]\ans[i]=\sum_{j=i}^{lim} (-1)^{j-i}{j! \over i! (j-i)!} f[j]\ans[i]\times i!=\sum_{j=i}^{lim} (-1)^{j-i}{j! \over (j-i)!} f[j]\\]
这里的\(lim=\min(\lfloor {n \over S}\rfloor , m)\),我们令\(A(x)=\sum_{i=0} ^{lim} (-1)^i i! x^i\),在令\(A=reverse(A)\),同时令\(B(x)=\sum_{i=0}^{lim} i!f[i] x^i\)

那么式子就转化成了这个样子:
\[
ans[i]\times i!=\sum_{j=i}^{lim} A_{lim+i-j} B_j
\]
这显然是个卷积的形式,于是我们直接上\(NTT\)即可

Code:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod=1004535809;
const int N=1e7+11;
const int M=4e5+11;
int n,m,s,ans,len=1,tim,lim,p[M];
int fac[N],ifac[N],W[M],g[M],f[M];
int read(){
    int x=0,f=1;char ch=getchar();
    while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();}
    while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
    return x*f;
}
int qpow(int x,int y){
    int re=1;
    while(y>0){
        if(y&1) re=re*x%mod;
        y>>=1;x=x*x%mod;
    }return re;
}
int C(int x,int y){
    if(x<y) return 0;
    return fac[x]*ifac[y]%mod*ifac[x-y]%mod;
}
void NTT(int *a,int flag){
    for(int i=0;i<len;i++)
        if(i<p[i]) swap(a[i],a[p[i]]);
    for(int l=2;l<=len;l<<=1){
        int wn=qpow(3,(mod-1)/l);
        if(flag==-1) wn=qpow(wn,mod-2);
        for(int st=0;st<len;st+=l){
            int w=1;
            for(int u=st;u<st+(l>>1);u++,w=w*wn%mod){
                int x=a[u],y=w*a[u+(l>>1)]%mod;
                a[u]=(x+y)%mod;a[u+(l>>1)]=(x+mod-y)%mod;
            }
        }
    }
}
signed main(){
    n=read(),m=read(),s=read();
    for(int i=0;i<=m;i++) W[i]=read();
    lim=min(n/s,m);++lim;
    while(len<(lim<<1)) len<<=1,++tim;
    --lim;
    for(int i=0;i<len;i++)
        p[i]=(p[i>>1]>>1)|((i&1)<<(tim-1));
    fac[0]=1;ifac[0]=1;
    for(int i=1;i<=max(len,max(n,m));i++) fac[i]=fac[i-1]*i%mod;
    ifac[max(len,max(n,m))]=qpow(fac[max(len,max(n,m))],mod-2);
    for(int i=max(len,max(n,m))-1;i;i--) ifac[i]=ifac[i+1]*(i+1)%mod;
    for(int i=0;i<=lim;i++){
        int inv=qpow(fac[s],i);
        inv=qpow(inv,mod-2);
        f[i]=C(m,i)*fac[n]%mod;
        f[i]=f[i]*inv%mod*ifac[n-s*i]%mod;
        f[i]=f[i]*qpow(m-i,n-s*i)%mod;
    }
    for(int i=0;i<=lim;i++) f[i]=f[i]*fac[i]%mod;
    for(int i=0;i<=lim;i++) g[lim-i]=(((i&1)?-1:1)*ifac[i]+mod)%mod;
    NTT(f,1);NTT(g,1);
    for(int i=0;i<=len;i++) f[i]=f[i]*g[i]%mod;
    NTT(f,-1);int invL=qpow(len,mod-2);
    for(int i=0;i<=len;i++) f[i]=f[i]*invL%mod;
    for(int i=0;i<=m;i++) ans=(ans+(f[lim+i]*ifac[i]%mod*W[i]%mod))%mod;
    printf("%lld\n",ans);
    return 0;
}

原文地址:https://www.cnblogs.com/NLDQY/p/12245139.html

时间: 2024-08-30 18:29:32

「HAOI2018」染色的相关文章

Loj #3111. 「SDOI2019」染色

Loj #3111. 「SDOI2019」染色 题目描述 给定 \(2 \times n\) 的格点图.其中一些结点有着已知的颜色,其余的结点还没有被染色.一个合法的染色方案不允许相邻结点有相同的染色. 现在一共有 \(c\) 种不同的颜色,依次记为 \(1\) 到 \(c\).请问有多少对未染色结点的合法染色方案? 输入格式 第一行有两个整数 \(n\) 和 \(c\),分别描述了格点图的大小和总的颜色个数. 之后两行,每行有 \(n\) 个整数:如果是 \(0\) 则表示对应结点未被染色,否

「IOI2018」Highway 高速公路收费

目录 「IOI2018」Highway 高速公路收费 题目描述: 实现细节: 输入格式: 输出格式: 样例: 数据范围与提示: 子任务: 题解: Code 「IOI2018」Highway 高速公路收费 题目描述: 在日本,城市是用一个高速公路网络连接起来的.这个网络包含 \(N\) 个城市和 \(M\) 条高速公路.每条高速公路都连接着两个不同的城市.不会有两条高速公路连接相同的两个城市.城市的编号是从 \(0\) 到 \(N-1\) ,高速公路的编号则是从 \(0\) 到 \(M-1\) .

「POJ3734」Blocks

「POJ3734」Blocks 题意 有\(n\)个盒子和红,蓝,绿,黄四种颜色.使用这四种颜色对盒子进行染色,其中红色和绿色的数量必须为偶数,询问方案数 Solution 易知此题可以用指数型生成函数解决 对于红色和绿色,其\(EGF\)为 \[G_e(x)=1+\frac{x^2}{2!}+\frac{x^4}{4!}+\frac{x^6}{6!}\dots=\frac{e^x+e^{-x}}{2}\] 蓝色和黄色的\(EGF\)为 \[G_e(x)=1+\frac{x^2}{2!}+\fr

AC日记——「HNOI2017」单旋 LiBreOJ 2018

#2018. 「HNOI2017」单旋 思路: set+线段树: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 100005 #define maxtree maxn<<2 int val[maxtree],tag[maxtree],L[maxtree],R[maxtree],mid[maxtree]; int op[maxn],ki[maxn],bi[maxn],cnt,size,n,ch[maxn]

「随笔」基于当下的思考

马德,说好的技术blog,变成日记本了... 下午的时候莫名其妙的感到很颓废,因为自己的不够强大感到忧虑和危机感十足.现在每每行走在技术的道路上,常觉得如履薄冰,如芒在背. 上大学之前和现在的心态其实差别挺大的,视野的开阔远远不止局限于自己的脚下.不过,这里的「上大学之前」只是一个时间描述词,并不觉得大学是最适合学习的地方,我很失望. 世界上的人无论性别,区域,宗教,兴趣爱好,总可以在互联网上找到志趣相同的人,总是可以不断打破自己的常识与惯性思维.总是有在相同领域比自己更强的人,挺好的. 关于知

「Unity」与iOS、Android平台的整合:3、导出的Android-Studio工程

本文属于「Unity与iOS.Android平台的整合」系列文章之一,转载请注明出处. Unity默认导出的是Android-Eclipse工程,毕竟Eclipse for Android开发在近一两年才开始没落,用户量还是非常巨大的. 个人认为AndroidStudio非常好用,能轻易解决很多Eclipse解决不了或者很难解决的问题. 所以我将Unity导出的Andoid工程分为Eclipse和AndroidStudio两部分. 不过我之后的相关内容都会使用AndroidStudio,希望依然

大数据和「数据挖掘」是何关系?---来自知乎

知乎用户,互联网 244 人赞同 在我读数据挖掘方向研究生的时候:如果要描述数据量非常大,我们用Massive Data(海量数据)如果要描述数据非常多样,我们用Heterogeneous Data(异构数据)如果要描述数据既多样,又量大,我们用Massive Heterogeneous Data(海量异构数据)--如果要申请基金忽悠一笔钱,我们用Big Data(大数据) 编辑于 2014-02-2817 条评论感谢 收藏没有帮助举报作者保留权利 刘知远,NLPer 4 人赞同 我觉得 大数据

开放的智力8:实用「成功学」

可实现的「成功学」 现在我想为这里的年轻人介绍一种可实现的「成功学」.希望这个我自创的理论,可以改变很多人的一生. 当我们评价一个事情值不值得去做.应该花多少精力去做的时候,应该抛弃单一的视角,而是分两个不同的维度来看,一是该事件将给我带来的收益大小(认知.情感.物质.身体方面的收益皆可计入),即「收益值」:二是该收益随时间衰减的速度,我称为「收益半衰期」,半衰期长的事件,对我们的影响会持续得较久较长. 这两个维度正交以后就形成了一个四象限图.我们生活.学习和工作中的所有事情都可以放进这个图里面

Linux 小知识翻译 - 「syslog」

这次聊聊「syslog」. 上次聊了「日志」(lgo).这次说起syslog,一看到log(日志)就明白是怎么回事了.syslog是获取系统日志的工具. 很多UINIX系的OS都采用了这个程序,它承担了「获取系统全部的日志」这个维持系统正常运行的重要任务. syslog的本体是「syslogd」这个daemon(一般翻译成守护进程),常驻内存中获取日志. syslog的特点是可以通过配置文件「/etc/syslog.conf」,对「哪种应用程序?哪种重要度的信息?记录在哪个文件中?」等进行细致的