首页 > 其他分享 >[HAOI2018]染色

[HAOI2018]染色

时间:2023-02-11 22:34:33浏览次数:54  
标签:frac ifac int 染色 LL rev text HAOI2018

\(\text{Solution}\)

第二道二项式反演题
挺套路的
设 \(g(i)\) 为恰好出现 \(S\) 次的颜色至少有 \(i\) 种
那么

\[g(i)=\binom{m}{i}\binom{n}{is}\frac{(is)!}{(s!)^i}(m-i)^{n-is} \]

然后二项式反演

\[f(i)=\sum_{j=i}^m (-1)^{j-i} \binom{j}{i} g(j) \]

这是 \(m^2\) 的
考虑把组合数拆开整理下看能否卷积

\[\begin{aligned} f(i) &=\sum_{j=i}^m (-1)^{j-i} \frac{j!}{i!(j-i)!} g(j) \\ &=\frac{1}{i!}\sum_{j=i}^m \frac{(-1)^{j-i}}{(j-i)!} j!g(j) \\ \end{aligned} \]

显然翻转系数就可以 \(\text{NTT}\) 了

\(\text{Code}\)

#include <bits/stdc++.h>
#define IN inline
using namespace std;

typedef long long LL;
const int N = 262155, P = 1004535809;
int n, m, s, w[N], fac[10000005], ifac[10000005], rev[N], g[N], f[N], h[N];

IN int fpow(int x, int y){int s = 1; for(; y; y >>= 1, x = (LL)x * x % P) if (y & 1) s = (LL)s * x % P; return s;}
IN int C(int n, int m){return (LL)fac[n] * ifac[m] % P * ifac[n - m] % P;}
IN void Add(int &x, int y){if ((x += y) >= P) x -= P;}

IN void NTT(int *a, int len, int inv) {
	for(int i = 0; i < len; i++) if (i < rev[i]) swap(a[i], a[rev[i]]);
	for(int mid = 1; mid < len; mid <<= 1) {
		int I = fpow(3, (P - 1) / (mid << 1));
		if (inv == -1) I = fpow(I, P - 2);
		for(int i = 0; i < len; i += (mid << 1)) {
			for(int j = 0, W = 1; j < mid; j++, W = (LL)W * I % P) {
				int x = a[i + j], y = (LL)W * a[i + j + mid] % P;
				a[i + j] = (x + y) % P, a[i + j + mid] = (x - y + P) % P;
			}
		}
	}
	if (inv == 1) return;
	inv = fpow(len, P - 2); for(int i = 0; i < len; i++) a[i] = (LL)a[i] * inv % P;
}

int main() {
	scanf("%d%d%d", &n, &m, &s); int mm = min(m, n / s);
	for(int i = 0; i <= m; i++) scanf("%d", &w[i]);
	fac[0] = ifac[0] = ifac[1] = 1;
	for(int i = 1; i <= max(n, m); i++) fac[i] = (LL)fac[i - 1] * i % P;
	for(int i = 2; i <= max(n, m); i++) ifac[i] = (LL)ifac[P % i] * (P - P / i) % P;
	for(int i = 2; i <= max(n, m); i++) ifac[i] = (LL)ifac[i] * ifac[i - 1] % P;
	int ipws = 1;
	for(int i = 0; i <= mm; i++, ipws = (LL)ipws * ifac[s] % P)
		g[i] = (LL)C(m, i) * C(n, i * s) % P * fac[s * i] % P * ipws % P * fpow(m - i, n - i * s) % P;
	for(int i = 0; i <= mm; i++) g[i] = (LL)g[i] * fac[i] % P, h[i] = (LL)((i & 1) ? P - ifac[i] : ifac[i]);
	reverse(g, g + mm + 1);
	int len = 1, bit = 0;
	while (len <= 2 * mm) len <<= 1, bit++;
	for(int i = 1; i < len; i++) rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << bit - 1);
	NTT(g, len, 1), NTT(h, len, 1);
	for(int i = 0; i < len; i++) g[i] = (LL)g[i] * h[i] % P;
	NTT(g, len, -1);
	for(int i = 0; i <= mm; i++) f[mm - i] = (LL)g[i] * ifac[mm - i] % P;
	int ans = 0;
	for(int i = 0; i <= mm; i++) Add(ans, (LL)f[i] * w[i] % P);
	printf("%d\n", ans);
}

标签:frac,ifac,int,染色,LL,rev,text,HAOI2018
From: https://www.cnblogs.com/leiyuanze/p/17112715.html

相关文章

  • 染色问题
    发现没学相关知识所以学学笔者写这篇文章时没应用过所以全是理论知识\(1.\)基础知识\(\textbf{定义1.1}\text{(置换)}\)一个\(S\)上的置换\(f:S\toS\)是一个......
  • 【NOIP2010】【codevs1069】关押罪犯(二分答案+二分图染色)
    problem将n个罪犯分别关押进2座监狱每2个罪犯之间有一个冲突值,当他们在同一监狱时就会爆发让爆发的冲突值(最大的那个)最小,求那个最小值solution考虑判定:是否存在一种分配方案......
  • 【YBT2023寒假Day6 C】子串染色(SAM)(线段树)(启发式合并)
    子串染色题目链接:YBT2023寒假Day6C题目大意对于一个s的子串t,把它在s中所有出现的位置包含的所有下标染黑,黑色连续段的数目是子串t的价值。然后给你一个k和一......
  • POJ 1436 Horizontally VisibleSegments(线段树成段更新+区间覆盖染色)
    DescriptionThereisanumberofdisjointverticallinesegmentsintheplane.Wesaythattwosegmentsarehorizontallyvisibleiftheycanbeconnectedbyaho......
  • 【YBT2023寒假Day4 A】网格染色(DP)(矩阵乘法)(DFT)
    网格染色题目链接:YBT2023寒假Day4A题目大意有一个n*3的网格,你可以选恰好m个格子染成黑色。然后对于一个黑点,我们对它周围的\(8\)个点中的一些有限制不能是黑点,......
  • 【题解】P4491 [HAOI2018]染色
    思路NTT优化二项式反演。首先考虑到求“正好有\(k\)种颜色出现\(S\)次”的方案数,所以可以考虑转化成求“至少有\(k\)种颜色出现\(S\)次”的方案数。形式化......
  • 通关搜索和图论 day_17 -- 染色法 & 匈牙利算法
    染色法一个图是二分图当且仅当她可以被2染色(不含有奇数环)流程如下,先找到一个不在集合中的点把他放在左边然后遍历这个点有连接的点,把这些点放到右边,再依次遍历放到右......
  • 二分图与染色算法
    二分图的概念二分图就是顶点集V可分割为两个互不相交的子集,并且图中每条边依附的两个顶点都分属于这两个互不相交的子集,两个子集内的顶点不相邻。    染色法概......
  • 树上染色-题解(贪心+DP+二分)
    树的上色题意简述树上有两个黑点,在每个单位时间内,每个黑点可以把自己相邻的一个白点变为黑色,求把整棵树所有点变为黑色的最短时间。\(n\)个点,两个黑点分别为\(x,y\)。......
  • nove。21 开染色!
    https://www.luogu.com.cn/problem/P2486多年前没做起的一道紫题现在看看能不能干掉它线段树维护区间颜色数、头尾颜色难点在于查询时如何合并区间不会,遂翻题解找到......