Problem A: Sgu282 Isomorphism

Time Limit: 15 Sec  Memory Limit: 64 MB
Submit: 172  Solved: 88
[Submit][Status][Discuss]

Description

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

Input

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

Output

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

Sample Input

3 4 97

Sample Output

20

HINT


题解:

   一眼可以看出这是置换群吧,但是它要求的是边置换,开始感觉没什么思路,但是想想一条边由(u,v)两个点构成

   于是我们有了新的思路:考虑将点置换转换为边置换

    

   我们可以发现点置换转化为的边置换同样具有相应的循环节

   于是考虑使用polya定理解决这个问题

   L:表示一个循环的大小; C:表示循环节的个数;

   首先对于一条边(u,v)它要分为两种情况:

   (1)u,v不在在同一个点循环,于是对于这条边所在的循环的大小为Lu-v=lcm(Lu,Lv),Cu-v=(Lu*Lv)/lcm(Lu,Lv)=gcd(Lu,Lv);

   (2) u,v在同一个点循环,于是分奇数和偶数进行讨论:

     一共C(L,2)条边 注:此处C为组合数

     1.奇数:Li是奇数,每个循环覆盖Li条边;循环节个数:

     2.偶数:Li是偶数,一个特例:覆盖Li/2条边的循环;循环节个数:

    (3)由上可知循环节个数:

    •实际N!个点置换中,有多少个     结构呢?

    •一个循环看成一个圆排列,现在要把N个人分配到k个长度分别为 的独立不相关圆排列中
    •因为有     Li==Lj  的情况,设Bi为有多少个Lj=i
    •总分配数为

   (4由上求出答案即可:


#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdio>
#define ll long long
#define N 70
using namespace std;
ll n,m,p;
ll num[N],l[N],bin[N];
ll ans;
ll read()
{
ll x=,f=; char ch;
while (ch=getchar(),ch<''||ch>'') if (ch=='-') f=-;
while (x=x*+ch-'',ch=getchar(),ch>=''&&ch<='');
return x*f;
}
int gcd(int a,int b){return b?gcd(b,a%b):a;
}
ll ksm(int x,int k){ll res=; for (int i=k; i; i>>=,x=1ll*x*x%p) if (i&) res=1ll*res*x%p; return res;
}
void cal(int k)
{
ll s=;
for (int i=; i<=n; i++) num[i]=;
for (int i=; i<=k ;i++) num[l[i]]++;
for (int i=; i<=k; i++) s=s*l[i]%p;
for (int i=; i<=n; i++) s=s*bin[num[i]]%p;
int c=;
for (int i=; i<=k; i++)
{
c+=l[i]/;
for (int j=i+; j<=k; j++) c+=gcd(l[i],l[j]);
}
ans=(ans+ksm(m,c)*bin[n]%p*ksm(s,p-)%p)%p;
}
void dfs(int x,int k,int last)
{
if (x==n+) {cal(k-); return;}
for (int i=; i<=last && x+i<=n+; i++)
{
l[k]=i; dfs(x+i,k+,i);
}
}
int main()
{
n=read(); m=read(); p=read();
bin[]=; for (int i=; i<=n; i++) bin[i]=bin[i-]*i%p;
dfs(,,n);
printf("%lld\n",ans*ksm(bin[n],p-)%p);
return ;
}

BZOJ1478 Sgu282 Isomorphism的更多相关文章

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

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

  2. 【BZOJ1478】Sgu282 Isomorphism Pólya定理神题

    [BZOJ1478]Sgu282 Isomorphism 题意:用$m$种颜色去染一张$n$个点的完全图,如果一个图可以通过节点重新标号变成另外一个图,则称这两个图是相同的.问不同的染色方案数.答案对 ...

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

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

  4. bzoj1478:Sgu282 Isomorphism

    思路:由于题目中是通过改变点的编号来判断两种染色方案是否相同,而染色的确是边,于是考虑如何将点置换转化为边置换. 对于一个有n个点的完全图,其点置换有n!个(即全排列个数),又由于每一个边置换都对应了 ...

  5. bzoj 1478: Sgu282 Isomorphism && 1815: [Shoi2006]color 有色图【dfs+polya定理】

    参考 https://wenku.baidu.com/view/fee9e9b9bceb19e8b8f6ba7a.html?from=search### 的最后一道例题 首先无向完全图是个若干点的置换 ...

  6. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  7. 「算法笔记」Polya 定理

    一.前置概念 接下来的这些定义摘自 置换群 - OI Wiki. 1. 群 若集合 \(s\neq \varnothing\) 和 \(S\) 上的运算 \(\cdot\) 构成的代数结构 \((S, ...

  8. 【sgu282】Isomorphism

    题意: 给出n(n<=53)点的无向完全图 要将每条边染上m(m<=1000)种颜色的一种 只改变顶点编号的图视为同种方案 求本质不同方案数%p(p>n且为质树)的值 题解: 这题貌 ...

  9. Isomorphism 同构

    小结: 1.两个有限维度的向量空间,在同一数域下,是同构的 等价于 它们维数相等. Isomorphism 同构 0.1.8 Isomorphism. If U and V are vector sp ...

随机推荐

  1. typedef void far *LPVOID 的具体定义

    首先这里的far,在32位系统已经废除不用了.它是C/C++语言在16位系统中用以标明指针是个远指针的修饰符. 远指针是说指针所指向的地址已经超出了64K(2的十六次方),所以需要使用DS加偏移量的方 ...

  2. 使用Emmet加速Web前端开发

    Emmet插件以前被称作为Zen Coding,是一个文本编辑器的插件,它可以帮助您快速编写HTML和CSS代码,从而加速Web前端开发.早在2009年,Sergey Chikuyonok写过一篇文章 ...

  3. EXCEL读写NPOI

    1.第一步: 可以使用ExcelAutomation进行EXCEl文件的读写,但是需要电脑上安装EXCEL,对EXCEL版本有要求,速度慢,有安全性,并发性问题,不适合网站类项目. 第二种方法: NP ...

  4. DW常用

    Dreamweaver代码 基本结构标签: <HTML>,表示该文件为HTML文件 <HEAD>,包含文件的标题,使用的脚本,样式定义等 <TITLE>---< ...

  5. IE6 7 父级元素的overflow:hidden 是包不住子级的relative

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  6. ExtJS4.1自带API打不开的问题解决

    在ext官网个下载的最新版本的extjs,本来想看看里面的docs文档的,结果却发现打不开,总是转个不停,于是就打开index.html的源码,看到引入ext的js文件的时候,看到引入的是ext.js ...

  7. ecstore中kvstore之mongodb

    mongodb安装 详细见 http://blog.csdn.net/motian06/article/details/17560067 mongodb扩展安装 详细见 http://blog.csd ...

  8. Myeclipse配置优化

    http://blog.csdn.net/chen_zw/article/details/7525277

  9. AOP 在javascript 中的使用

    AOP(Aspect Oriented Programming) 意为面向切面编程 可以在不修改原有代码的情况下增加新功能,利用AOP可以对业务逻辑各个部分进行隔离,从而使得业务逻辑各部分的耦合度降低 ...

  10. CSS文字垂直居中和font-family属性

    1.单行文字的垂直居中 单行文字垂直居中比较简单,直接让行高==盒子高度即可. 2.多行文字居中 多行文字居中,只需简单计算一下盒子的上padding即可.计算公式:padding-top=(盒子的高 ...