1478: Sgu282 Isomorphism

Description

给 定一个N 个结点的无向完全图( 任意两个结点之间有一条边), 现在你可以用 M 种颜色对这个图的每条边进行染色,每条边必须染一种颜色。 若两个已染色的图,其中一个图可以通过结点重新编号而与另一个图完全相同, 就称这两个染色方案相同。 现在问你有多少种本质不同的染色方法,输出结果 mod P。P 是一个大于N 的质数。

Input

仅一行包含三个数,N、M、P。

Output

仅一行,为染色方法数 mod P 的结果。

Sample Input

3 4 97

Sample Output

20

HINT

数据范围:1≤N≤53,1≤M≤1000,N

【分析】

  关于这题,这文档讲得很清楚:http://wenku.baidu.com/view/fee9e9b9bceb19e8b8f6ba7a.html?from=search###

  这题想起来挺难的。

  首先它是对点的置换,但是是边染上了颜色,就是说实际上是边的置换。所以我们要看一下点置换和边置换之间的关系。

  假定一个点置换,把它表示为循环,比如是(a1,a2,....)(b1,b2...)(c1,c2...)...

  1、对于不在一个循环里面的点:

  比如a1,b1, 那么会有边循环((a1,b1),(a2,b2)...) 设a循环的循环节是l1,b循环的循环节是l2,那么形成的边循环的循环节显然是LCM(l1,l2)。

  一共有l1*l2个点对,每个点对都在一个循环节为LCM(l1,l2)的循环上,所以一共有l1*l2/LCM(l1,l2)=GCD(l1,l2)个循环节,所以C(f)=m^GCD(l1,l2)。(回到burnside引理,C为置换之后仍为本身的数目,就是说要循环节里的每条边都一样的颜色)

  2、对于在一个循环里面的点:

  比如a1、a2。设这个a循环的循环节为l1。

  如果l1是奇数,那么循环长度为l1,一共有C(l1,2)个点对,所以是(l1-1)/2个循环节,所以C(f)=m^((l1-1)/2)。

  如果l1是偶数,除了上面这种情况之外,还有一种的循环节是l1/2(就是两个点刚好相隔半个周期,而边是双向的),所以一共有(C(l1,2)-l1/2)/l1+1=l1/2个点对。

  整理一下:

  

  

  所以代码很简单,只要枚举n的拆分,然后计算不动点就好了。这里有用到逆元,p是质数可以用费马小定理。

  分母上面先乘完再求逆元,我就是一边乘一边逆元就超时了。。。ORZ。。。

 #include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define Maxn 60
#define LL long long int n,m;
LL pw[Maxn],N,p,ans; LL qpow(LL a,LL b)
{
LL ans=;
while(b)
{
if(b&) ans=(ans*a)%p;
a=(a*a)%p;
b>>=;
}
return ans;
} LL l[Maxn]; int gcd(int a,int b)
{
if(b==) return a;
return gcd(b,a%b);
} void get_ans(int x)
{
int c=;
for(int i=;i<=x;i++) c+=l[i]/;
for(int i=;i<=x;i++)
for(int j=i+;j<=x;j++) c+=gcd(l[i],l[j]);
LL now=;
for(int i=;i<=x;i++) now=(now*l[i])%p;
int cnt=;
for(int i=;i<=x;i++)
{
if(l[i]!=l[i-])
{
now=(now*pw[cnt])%p;
cnt=;
}
cnt++;
}
now=(now*pw[cnt])%p;
now=(N*qpow(now,p-))%p;
ans=(ans+now*qpow(m,c))%p;
// printf("%d\n",ans);
} void ffind(int x,int st,int h)
{
if(h==)
{
get_ans(x-);
}
if(h<st) return;
for(int i=st;i<=h;i++)
{
l[x]=i;
ffind(x+,i,h-i);
}
} int main()
{
scanf("%d%d%lld",&n,&m,&p);
N=;
for(int i=;i<=n;i++) N=(N*i)%p;
pw[]=;
for(int i=;i<=n;i++) pw[i]=(pw[i-]*i)%p;
ans=;
ffind(,,n);
printf("%lld\n",(ans*qpow(N,p-))%p);
return ;
}

2017-01-12 11:34:31

【BZOJ 1478】 1478: Sgu282 Isomorphism (置换、burnside引理)的更多相关文章

  1. BZOJ 1488 Luogu P4727 [HNOI2009]图的同构 (Burnside引理、组合计数)

    题目链接 (Luogu) https://www.luogu.org/problem/P4727 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.ph ...

  2. [bzoj 1004][HNOI 2008]Cards(Burnside引理+DP)

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1004 分析: 1.确定方向:肯定是组合数学问题,不是Polya就是Burnside,然后题目上 ...

  3. BZOJ_[HNOI2008]_Cards_(置换+Burnside引理+乘法逆元+费马小定理+快速幂)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1004 共n个卡片,染成r,b,g三种颜色,每种颜色的个数有规定.给出一些置换,可以由置换得到的 ...

  4. 【BZOJ1004】【HNOI2008】Cards 群论 置换 burnside引理 背包DP

    题目描述 有\(n\)张卡牌,要求你给这些卡牌染上RGB三种颜色,\(r\)张红色,\(g\)张绿色,\(b\)张蓝色. 还有\(m\)种洗牌方法,每种洗牌方法是一种置换.保证任意多次洗牌都可用这\( ...

  5. luogu P1446 [HNOI2008]Cards burnside引理 置换 不动点

    LINK:Cards 不太会burnside引理 而这道题则是一个应用. 首先 一个非常舒服的地方是这道题给出了m个本质不同的置换 然后带上单位置换就是m+1个置换. burnside引理: 其中D( ...

  6. 【BZOJ 1004】 1004: [HNOI2008]Cards (置换、burnside引理)

    1004: [HNOI2008]Cards Description 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun很 ...

  7. [BZOJ 1004] [HNOI2008] Cards 【Burnside引理 + DP】

    题目链接:BZOJ - 1004 题目分析 首先,几个定义和定理引理: 群:G是一个集合,*是定义在这个集合上的一个运算. 如果满足以下性质,那么(G, *)是一个群. 1)封闭性,对于任意 a, b ...

  8. BZOJ 1004 HNOI2008 Cards Burnside引理

    标题效果:特定n张卡m换人,编号寻求等价类 数据保证这m换人加上置换群置换后本身构成 BZOJ坑爹0.0 条件不那么重要出来尼玛怎么做 Burnside引理--昨晚为了做这题硬啃了一晚上白书0.0 都 ...

  9. BZOJ 1004 Cards(Burnside引理+DP)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1004 题意:三种颜色的扑克牌各有Sr,Sb,Sg张.给出m种置换.两种染色方案在某种置换 ...

随机推荐

  1. bzoj3172 Ac自动机

    根据fail树的性质 我们在建树的时候每建一个串就将他路径上的点全部加1表示这个串的后缀又出现了一次 然后从下到上把sum加起来就可以得到答案了 #include<cstdio> #inc ...

  2. windows7_常用操作终端操作

    查看环境变量:set 添加环境变量:set aa = 88 删除环境变量:set aa = 查看ip配置:ipconfig 查看全局环境变量配置:path 查看当前目录文件:dir 进入E盘:E: 进 ...

  3. html中的meta标签

    1.定义 meta元素提供页面的原信息,位于文档头部 2.必须的属性 content属性 该属性提供名称/值对中的值,使用要与http-equiv或name属性一起使用 3.可选的属性 3.1.htt ...

  4. Python3 xml模块的增删改查

    xml数据示例 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 <data>     < ...

  5. 在linux程序里面,知道一个函数地址,改函数是属于某个动态库的,怎么样得到这个动态库的全【转】

    转自:http://www.360doc.com/content/17/1012/11/48326749_694292472.shtml 另外dl_iterate_phdr可以查到当前进程所装在的所有 ...

  6. python基础===Number

    本文转自:python之Number 1.Python number数字 Python Number 数据类型用于存储数值. 数据类型是不允许改变的,这就意味着如果改变 Number 数据类型的值,将 ...

  7. 【2017 Multi-University Training Contest - Team 1】小结

    啊人生第一次打多校被虐 紧随yql的脚步做题. 1001: 可以发现我们平时表示的数都是$x*log_{10}{10}$,所以类似于做一个换底公式就可以了. -1是一个烟雾弹,因为小学生都知道2^n不 ...

  8. C 实现有追求的线程池 探究

    引言 线程池很普通的老话题,讨论的很多.深入的不多,也就那些基础库中才能见到这种精妙完备的技巧.而本文随大流 想深入简述一种高效控制性强的一种线程池实现. 先引入一个概念, 惊群. 简单举个例子. 春 ...

  9. C json实战引擎 三 , 最后实现部分辅助函数

    引言 大学读的是一个很时髦的专业, 学了四年的游戏竞技. 可惜没学好. 但认真过, 比做什么都认真. 见证了  ...... 打的所有游戏人物中 分享一位最喜爱 的 “I've been alone ...

  10. 网站服务器压力Web性能测试(2):Webbench:最多模拟3万个并发连接数测试压力

    1.Webbench最多可以模拟3万个并发连接数来测试服务器压力,可以设置压力测试时间和测试请求的成功率.安装Webbench命令: wget https://home.tiscali.cz/~cz2 ...