Atcoder abc284
https://atcoder.jp/contests/abc284/tasks
Ex - Count Unlabeled Graphs
按照下面步骤生成图
选 简单,无向,n个无标签点 的图
给每个点 写 <= k的数, (1~k每个都至少出现一次
找方案数 mod p(质数 1e8~1e9)
范围
k <= n <= 30
我的思路
无标签的图 和 有标签的图之间 如何进行 重复统计的转化 ???
考虑按照连通块来划分
连通块大小 和 同联通块大小的选择个数
f[s] = 每个连通块大小为s 的 染色方案数 的生成方程 = a[s] x^s + a[2s] x^2s + a[3s] x^3s …
为了统计 g[s] = 加上外部贡献的选择倍数 = a[s]/s! x^s + a[2s]/(2s)! x^2s + a[3s]/(3s)! x^3s …
这样 ans = [x^n] n! g[1] * g[2] * g[3] * ... * g[n]
那么问题来了, 如何计算f[i]
h[i] = 1个大小为i的联通块的染色方案数
a[i] = h[i], 直接染色
a[2i] = binom(2i,i-1) h[i] * h[i], 确定1在地一个块
a[3i] = binom(3i,i-1) * binom(2i,i-1) h[i]^3, 确定1在地一个块, 不在第一个块中最小的在第二个块
那么如何计算h[i]
count[形状] = 一个形状的染色方案数
h[i] = sum count[形状i]
形状不同, 染色后一定不同, 但是相同形状 染色后可能相同,
如何判断两个形状不同, 如何枚举形状, 每个形状如何计算染色方案??????????????????????????
并不会
能想到一些必要条件, 但没啥充分条件, 比如 点i连的点和相同,且度相同