[HAOI2018] 染色 题解
第一眼肯定想到容斥。设 \(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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)