[bzoj1488][hnoi2009]同构图

题意:求n个点的图的本质不同的方案数。

首先考虑n个点有n!种置换,而由点置换引起的边置换是一一对应的。

然后对于点置换,易有循环节完全相等的置换相互等价,而其方案数为n的整数拆分,对于数据范围可以接受。

对于每一类等价置换,首先考虑循环节的位置,有n!/Πi=1 to m l[i]!种方案,其中m为循环节数,l为循环节长度。

然后考虑对于每一个循环节本身可以有的方案数,在确定第一个循环的点后,易有为(l-1)!。

然后考虑循环节长度相等的循环节,其位置的不同对于方案并无贡献,即等价,而刚才我们考虑了其位置,将其作为不同的方案计算。

故对于每一组长度相等的循环节除去其数量的全排列消除位置变化的影响。

至此对于每一类置换,有其对答案分子的贡献为:n!/((Πi=1 to m l[i]) *Πi=1 to k t[i]!),其中k为长度相等的循环节组数,t为每组长度相等的循环节节数。

然后考虑每一类等价点置换对于边置换的贡献。

在同一循环节内,设其长度为l,枚举边置换(1, 2)->(2, 3),etc, (1, 3)->(2, 4), etc, ect。易有存在置换(k, l)->(k+1, 1), 其中k < l。

此时对于边(1, k+1),他已经在置换中出现,意味着枚举已经结束。

所以 k <= l - k, 故 k <= l / 2, 而 k 为枚举值,所以边置换数为 l / 2。

对于任意两个不同点循环节,设其长度分别为l1, l2, 令 l1 <= l2。

枚举边置换,考虑两个点循环节为环状,则易有当结束模拟某个边循环节的枚举时,已枚举了 lcm(l1, l2) 条边。

而对于两个不同点循环节,实际的边数应为 l1 * l2,所以一次枚举只能得到总数的 lcm(l1, l2) / (l1 * l2)。

易有上式的值为 1 / gcd(l1, l2),故边循环节数量为gcd(l1, l2)。

然后考虑染色,显然一条边是否出现等价于用两种颜色染色边循环节。

至此可以通过Pólya定理得到答案为

Σ2^(Σi=1 to m Σj=1 to m gcd(l[i], l[i]) + Σi=1 to m l[i]/2) * (n!/((Πi=1 to m l[i]) * Πi=1 to k t[i]!)) / n!

对于逆元,阶乘和2次幂由于数据范围很小可以预处理方便计算。

我觉得要想不超时必须在枚举整数拆分时同时处理各种系数,会写得很复杂,于是怒打一张表0msA之。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值