参考 https://wenku.baidu.com/view/fee9e9b9bceb19e8b8f6ba7a.html?from=search### 的最后一道例题

首先无向完全图是个若干点的置换,但是实际上要染色边,也就是要求边的置换

首先,通过dfs构造一个点的置换,然后再把每个置换分割加起来就是答案(实际上分割方案很少)

那么现在有一个点置换的长度(a1,a2,a3...),考虑边置换,一条边(pi,pj),如果pi,pj在不同的置换里,那么显然循环节是lcm(ai,aj),所以循环个数就是gcd(ao,aj);

对于pi,pj在同一个置换里,如果a是奇数,那么只有循环节长度为2的循环个数就是(a-1)/2,如果是偶数,除了长度为2的循环节还有长度为a/2的,所以个数是a/2

然后一个拆分的方案数是https://blog.csdn.net/litble/article/details/79116659















  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;
  4. const int N=60;
  5. int n,m;
  6. long long fac[N],mod,ans,a[N];
  7. long long gcd(long long a,long long b)
  8. {
  9. return !b?a:gcd(b,a%b);
  10. }
  11. long long ksm(long long a,long long b)
  12. {
  13. long long r=1;
  14. while(b)
  15. {
  16. if(b&1)
  17. r=r*a%mod;
  18. a=a*a%mod;
  19. b>>=1;
  20. }
  21. return r;
  22. }
  23. void dfs(int w,int s,int y)
  24. {
  25. if(!y)
  26. {
  27. int c=0,tot=1;
  28. long long nw=1;
  29. for(int i=1;i<w;i++)
  30. c+=a[i]/2;
  31. for(int i=1;i<w;i++)
  32. for(int j=i+1;j<w;j++)
  33. c+=gcd(a[i],a[j]);
  34. for(int i=1;i<w;i++)
  35. nw=nw*a[i]%mod;
  36. for(int i=2;i<w;i++)
  37. {
  38. if(a[i]!=a[i-1])
  39. nw=nw*fac[tot]%mod,tot=0;
  40. tot++;
  41. }
  42. nw=fac[n]*ksm(nw*fac[tot]%mod,mod-2)%mod;
  43. ans=(ans+nw*ksm(m,c))%mod;
  44. }
  45. if(y<s)
  46. return;
  47. for(int i=s;i<=y;i++)
  48. {
  49. a[w]=i;
  50. dfs(w+1,i,y-i);
  51. }
  52. }
  53. int main()
  54. {
  55. scanf("%d%d%lld",&n,&m,&mod);
  56. fac[0]=1;
  57. for(int i=1;i<=n;i++)
  58. fac[i]=fac[i-1]*i%mod;
  59. dfs(1,1,n);
  60. printf("%lld\n",ans*ksm(fac[n],mod-2)%mod);
  61. return 0;
  62. }

bzoj 1478: Sgu282 Isomorphism && 1815: [Shoi2006]color 有色图【dfs+polya定理】的更多相关文章

  1. BZOJ 1815: [Shoi2006]color 有色图(Polya定理)

    题意 如果一张无向完全图(完全图就是任意两个不同的顶点之间有且仅有一条边相连)的每条边都被染成了一种颜色,我们就称这种图为有色图. 如果两张有色图有相同数量的顶点,而且经过某种顶点编号的重排,能够使得 ...

  2. bzoj 1815: [Shoi2006]color 有色图 置换群

    1815: [Shoi2006]color 有色图 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 136  Solved: 50[Submit][Stat ...

  3. BZOJ 1815: [Shoi2006]color 有色图 [Polya DFS 重复合并]

    传送门 题意: 染色图是无向完全图,且每条边可被染成k种颜色中的一种.两个染色图是同构的,当且仅当可以改变一个图的顶点的编号,使得两个染色图完全相同.问N个顶点,k种颜色,本质不同的染色图个数(模质数 ...

  4. 【BZOJ 1478】 1478: Sgu282 Isomorphism (置换、burnside引理)

    1478: Sgu282 Isomorphism Description 给 定一个N 个结点的无向完全图( 任意两个结点之间有一条边), 现在你可以用 M 种颜色对这个图的每条边进行染色,每条边必须 ...

  5. BZOJ1815: [Shoi2006]color 有色图

    BZOJ1815: [Shoi2006]color 有色图 Description Input 输入三个整数N,M,P 1< = N <= 53 1< = M < = 1000 ...

  6. [SHOI2006]color 有色图[群论、组合计数]

    题意 用 \(m\) 种颜色,给 \(n\) 个点的无向完全图的 \(\frac{n(n-1)}{2}\) 条边染色,两种方案相同当且仅当一种方案交换一些点的编号后可以变成另一种方案.问有多少本质不同 ...

  7. BZOJ1815 SHOI2006有色图(Polya定理)

    置换数量是阶乘级别的,但容易发现本质不同的点的置换数量仅仅是n的整数拆分个数,OEIS(或者写个dp或者暴力)一下会发现不是很大,当n=53时约在3e5左右. 于是暴力枚举点的置换,并且发现根据点的置 ...

  8. [BZOJ1815&BZOJ1488]有色图/图的同构(Polya定理)

    由于有很多本质相同的重复置换,我们先枚举各种长度的点循环分别有多少个,这个暴搜的复杂度不大,n=53时也只有3e5左右.对于每种搜索方案可以轻易求出它所代表的置换具体有多少个. 但我们搜索的是点置换组 ...

  9. [BZOJ1478&1488&1815][SGU282]Isomorphism:Polya定理

    分析 三倍经验题,本文以[BZOJ1478][SGU282]Isomorphism为例展开叙述,主体思路与另外两题大(wan)致(quan)相(yi)同(zhi). 这可能是博主目前写过最长也是最认真 ...

随机推荐

  1. weexapp 开发流程(一)开发环境配置

    1.创建项目 weexpack create weexapp 2.安装必要插件 npm i jwt-simple vue-resource vue-router vuex vuex-router-sy ...

  2. 【转载】C#相等性比较

    本文阐述C#中相等性比较,其中主要集中在下面两个方面 ==和!=运算符,什么时候它们可以用于相等性比较,什么时候它们不适用,如果不使用,那么它们的替代方式是什么? 什么时候,需要自定一个类型的相等性比 ...

  3. 【转载】VS工具使用——代码生成函数关系图

    小引:        在上篇文章<VS工具使用--代码图>中,我向大家介绍了我对工具"代码图"的发现和认识.真是感觉当自己的眼睛不再被蒙蔽的时候,会发现整个世界的美好. ...

  4. hunnu--11545--小明的烦恼——找路径

    小明的烦恼--找路径  Time Limit: 2000ms, Special Time Limit:5000ms, Memory Limit:32768KB Total submit users:  ...

  5. Accelerated processing unit

    http://en.wikipedia.org/wiki/Accelerated_processing_unit Accelerated processing unit From Wikipedia, ...

  6. Intel Naming Strategy--1

    http://en.wikipedia.org/wiki/Mobile_Internet_device Computer sizes   Classes of computers   Larger S ...

  7. javascript读取和改动原型特别须要注意的事儿,由于原型的读写不具有对等性

    对于从原型对象继承而来的成员,其读和写具有内在的不正确等性.比方有一个对象A,假设它的原型对象是B.B的原型对象是null.假设我们须要读取A对象的name属性值,那么JS会优先在A中查找.假设找到了 ...

  8. [转载]php 数组 类对象 值传递 引用传递 区别

    一般的数据类型(int, float, bool)不做这方面的解说了 这里详细介绍一下数组和的类的对象作为参数进行值传递的区别 数组值传递 实例代码: <?php function main() ...

  9. Hibernate quick start

    Preface Working with both Object-Oriented software and Relational Databases can be cumbersome and ti ...

  10. python day-3 基本数据类型

    1. 编码 1. 最早的计算机编码是ASCII. 美国人创建的. 包含了英文字母(大写字母, 小写字母). 数字, 标点等特殊字符!@#$% 128个码位 2**7 在此基础上加了一位 2**8 8位 ...