BZOJ1478 Sgu282 Isomorphism

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=0,f=1; char ch;
    while (ch=getchar(),ch<‘0‘||ch>‘9‘) if (ch==‘-‘) f=-1;
    while (x=x*10+ch-‘0‘,ch=getchar(),ch>=‘0‘&&ch<=‘9‘);
    return x*f;
}
int gcd(int a,int b){return b?gcd(b,a%b):a;
}
ll ksm(int x,int k){ll res=1; for (int i=k; i; i>>=1,x=1ll*x*x%p) if (i&1) res=1ll*res*x%p; return res;
}
void cal(int k)
{
    ll s=1;
    for (int i=1; i<=n; i++) num[i]=0;
    for (int i=1; i<=k ;i++) num[l[i]]++;
    for (int i=1; i<=k; i++) s=s*l[i]%p;
    for (int i=1; i<=n; i++) s=s*bin[num[i]]%p;
    int c=0;
    for (int i=1; i<=k; i++)
    {
        c+=l[i]/2;
        for (int j=i+1; j<=k; j++) c+=gcd(l[i],l[j]);
    }
    ans=(ans+ksm(m,c)*bin[n]%p*ksm(s,p-2)%p)%p;
}
void dfs(int x,int k,int last)
{
    if (x==n+1) {cal(k-1); return;}
    for (int i=1; i<=last && x+i<=n+1; i++)
    {
        l[k]=i; dfs(x+i,k+1,i);
    }
}
int main()
{
    n=read(); m=read(); p=read();
    bin[0]=1; for (int i=1; i<=n; i++) bin[i]=bin[i-1]*i%p;
    dfs(1,1,n);
    printf("%lld\n",ans*ksm(bin[n],p-2)%p);
    return 0;
}

时间: 2024-10-05 01:25:04

BZOJ1478 Sgu282 Isomorphism的相关文章

【BZOJ1478】Sgu282 Isomorphism P&#243;lya定理神题

[BZOJ1478]Sgu282 Isomorphism 题意:用$m$种颜色去染一张$n$个点的完全图,如果一个图可以通过节点重新标号变成另外一个图,则称这两个图是相同的.问不同的染色方案数.答案对$P$取模. $n\le 53,m\le 1000,P>n,P$是质数. 题解:对于本题来说,每个元素是所有边,每个置换是边的置换,而边的置换难以表示,点的置换容易表示,所以我们考虑点置换和边置换的关系. 如果两个点置换有着相同的结构,则它们对应的边置换的循环数相同. $$\begin{pmatri

Sgu282 Isomorphism

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

组合计数(polya计数):SGU 282 Isomorphism

因为论文的题解写得太好了,直接贴. 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 using namespace std; 5 typedef long long LL; 6 const int N=55;int st[N]; 7 LL n,m,Mod,fac[N],ifac[N],pow[N],ans; 8 LL Inv(LL x){return x==1?x:(Mod-Mod/x)*

graph isomorphism 开源算法库VFlib, Nauty

VFlib 开源算法库网站:http://www.cs.sunysb.edu/~algorith/implement/vflib/implement.shtml Nauty 开源算法库网站:http://cs.anu.edu.au/people/bdm/nauty/

ZOJ - 4089 :Little Sub and Isomorphism Sequences (同构 set)

Little Sub has a sequence . Now he has a problem for you. Two sequences of length and of length are considered isomorphic when they meet all the following two conditions: ; Define as the number of times integer occur in sequence . For each integer in

ZOJ-4089-Little Sub and Isomorphism Sequences

给定你个数组,以及一些单点修改,以及询问,每次询问需要求得,最长的字串长度,它在其他位置存在同构. 当存在两个不相交的区间同构时,如: 1.2.…….n -1.n.n + 1.…….m.m + 1.m + 2. …….m + n - 1.m + n;(假设m > n&&[1, n]和[m + 1, m + n]同构) 那么 K = n 显然是存在的.但是这不是最大的K,因为[1, m]和[n + 1, n + m]也一定同构(使两边同时加上一个相同区间) 所以这题可以简化为找到一个区

HDU3926Hand in Hand(搜索 或 并查集)

Problem Description In order to get rid of Conan, Kaitou KID disguises himself as a teacher in the kindergarten. He knows kids love games and works out a new game called "hand in hand". Initially kids run on the playground randomly. When Kid say

【转】编程词汇

很实用的编程英语词库,共收录一千五百余条词汇. 第一部分: application 应用程式 应用.应用程序 application framework 应用程式框架.应用框架 应用程序框架 architecture 架构.系统架构 体系结构 argument 引数(传给函式的值).叁见 parameter 叁数.实质叁数.实叁.自变量 array 阵列 数组 arrow operator arrow(箭头)运算子 箭头操作符 assembly 装配件 assembly language 组合语

hdu 3926 Hand in Hand 同构图

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3926 In order to get rid of Conan, Kaitou KID disguises himself as a teacher in the kindergarten. He knows kids love games and works out a new game called "hand in hand". Initially kids run on the p