【Pólya计数】hnoi2009图的同构计数

题目的简单描述:计算出含有n(n<60)个点的无向图的本质不同的个数。

这里面本质不同的概念是一个图通过改变一些点的序号可以变成其他的图。

 

刚开始看这道题是晕的,60的范围很让人蛋疼,搜索?DP?记得以前在LTC男人八题里有一道有N个点的连通图的个数,但是这道题所有点是一样的,就涉及到了同构的问题。是通过非常巧妙的状态DP?还是通过等价类的搜索?

 

后来问了道长是Pólya计数。。比较无语的是,我看见这道题第一个排除的算法就是Pólya,他说的:任意两个点之间是没有区别的,那么也就意味着置换群有N!种,统计就更不现实的。

 

但是,实际上在这N!种置换群种有很多的同类的,一个比较直观的想法就是:对于每个循环节长度(的最小表示)完全一致的一起统计。

但是图同构是基于边(边的选与不选),所以我们还要把点置换转换为边置换,因为我们知道了点置换以后边置换就很明确了。

 

每个点置换的循环节长度怎么办?搜!其实实际上我们相当于求了一个N的整数拆分,60的整数拆分是多少?1000000!

 

那么现在我们的任务就是统计同类的置换有多少种,因为我们已经枚举除了每个点置换的循环节长度,那么剩下的任务就是把这些点‘放入’这些‘桶子’之中。但是由于是无向图,我们还需要注意一些细节。。。

 

关于除法运算,我们使用欧拉定理即可(题目要求输出ans mod 997,997为质数):a/b=a*bp-2 (mod p).

另外,做充分的预处理是非常重要的,要不然就只能打表交了。。。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值