1815: [Shoi2006]color 有色图

Time Limit: 4 Sec  Memory Limit: 64 MB
Submit: 136  Solved: 50
[Submit][Status]

Description

Input

输入三个整数N,M,P
1< = N <= 53
1< = M < = 1000
N< P < = 10^ 9

Output

即总数模P后的余数

Sample Input

input 1
3 2 97

Sample Output

output 1
4
 
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
#define PROB "graph"
#define MAXE MAXN*MAXN
#define MAXN 66
#define MAXM MAXN*MAXN
typedef long long qword;
int n,m,mod;
struct edge
{
int x,y;
}e[MAXE];
bool operator < (edge e1,edge e2)
{
if (e1.x==e2.x)return e1.y<e2.y;
return e1.x<e2.x;
}
bool vis[MAXN];
int vec[MAXN];
qword sum=;
int per[MAXM];
int g[MAXN];
qword pow_mod(qword x,qword y)
{
qword ret=;
while (y)
{
if (y&)ret=ret*x%mod;
x=x*x%mod;
y>>=;
}
return ret;
}
void init()
{
int i,j,k;
int m;
int x,y;
for (i=;i<=n;i++)
{
m=;
for (j=;j<i;j++)
for (k=j+;k<i;k++)
e[m].x=j,e[m++].y=k;
for (j=;j<m;j++)
{
edge et;
et.x=min((e[j].x+)%i,(e[j].y+)%i);
et.y=max((e[j].x+)%i,(e[j].y+)%i);
per[j]=lower_bound(e,e+m,et)-e;
}
for (j=;j<m;j++)
{
if (~per[j])
{
g[i]++;
x=j;
y=per[x];
per[x]=-;
while (~per[y]){
x=y;
y=per[x];
per[x]=-;
}
}
}
}
return ;
}
int gcd(int x,int y)
{
return x%y==?y:gcd(y,x%y);
}
qword fact[MAXN],ufact[MAXN],uval[MAXN];
int gcdv[MAXN][MAXN];
int totv;
void dfs(int s,int b)
{
if (!s)
{
register qword val=;
register int res=,n0=n,i,j;
for (i=;i<totv;i++)
for (j=i+;j<totv;j++)
res=(res+gcdv[vec[i]][vec[j]])%(mod-);
for (i=;i<totv;i++)
{
res=(res+g[vec[i]])%(mod-);
val=val*fact[n0]%mod*ufact[n0-vec[i]]%mod*ufact[vec[i]]%mod;
n0-=vec[i];
}
//for (int i=0;i<totv;i++)printf("%d ",vec[i]);printf("\n");
for (i=;i<totv;)
{
for (j=i;j<totv && vec[j]==vec[i];j++);
val=val*ufact[j-i]%mod;
i=j;
}
for (i=;i<totv;i++)
val=val*fact[vec[i]]%mod*uval[vec[i]]%mod;
//printf("val:%d\n",val);
//printf("res:%d\n",res);
sum+=pow_mod(m,res)*val%mod;
sum%=mod;
return ;
}
for (int i=b;i<=s;i++)
{
vec[totv++]=i;
dfs(s-i,i);
totv--;
}
}
int main()
{
freopen("input.txt","r",stdin);
int i,j,k,x,y,z;
scanf("%d%d%d",&n,&m,&mod);
init();
fact[]=;
for (i=;i<=n;i++)
for (j=;j<=n;j++)
gcdv[i][j]=gcd(i,j);
for (i=;i<=n;i++)
fact[i]=fact[i-]*i%mod;
for (i=;i<=n;i++)
ufact[i]=pow_mod(fact[i],mod-);
for (i=;i<=n;i++)
uval[i]=pow_mod(i,mod-);
dfs(n,);
printf("%lld\n",sum*ufact[n]%mod);
}
  也许我的想法和标准的想法还是有那么一点点偏差,但还是能做的,我们考虑将这道题转换为标准的染色问题,由于图的变换可以是点的任意置换,所以说图的置换群是n!个点的置换,注意,是“点的置换”,与“边的染色”,所一我们考虑点与变得关系,最朴素的做法是:枚举n!个排列,对于每个排列,算出边的置换以及置换群个数,同ploya定理做。
  然后考虑到n!的排列个数太慢了。于是考虑到置换的性质,我们可以直接枚举点置换的循环节长度的组成,对于跨越两个长度x,y循环节间的边,循环节长度必定为lcm(x,y),变得个数为x*y,所以循环节个数为gcd(x,y),但是循环节内部的边就比较麻烦,虽然看其他程序这也是一个很简单的式子,但是我不会推,就直接暴力预处理求出循环节数。
  最后通过各种排列组合的公式,算出每一个循环节组成代表的排列个数,这道题就完了。
 

bzoj 1815: [Shoi2006]color 有色图 置换群的更多相关文章

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

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

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

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

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

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

  4. BZOJ1815: [Shoi2006]color 有色图

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

  5. 洛谷 P4128: bzoj 1815: [SHOI2006]有色图

    题目传送门:洛谷 P4128. 计数好题,原来是 13 年前就出现了经典套路啊.这题在当年应该很难吧. 题意简述: \(n\) 个点的完全图,点没有颜色,边有 \(m\) 种颜色,问本质不同的图的数量 ...

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

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

  7. 【BZOJ 1815】【SHOI 2006】color 有色图

    http://www.lydsy.com/JudgeOnline/problem.php?id=1815 这道题好难啊,组合数学什么根本不会啊qwq 题解详见08年的Pólya计数论文. 主要思想是只 ...

  8. 「SHOI2006」有色图

    首先发现这题虽然是边的置换,但是是由点的置换所造成的,并且发现点置换对应的所有边置换和置换操作构成置换群. 由于颜色可以全选,那么根据 Polya 定理,答案为: \[|X / G| = \frac{ ...

  9. bzoj 1025 [SCOI2009]游戏(置换群,DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1025 [题意] 给定n,问1..n在不同的置换下变回原序列需要的不同排数有多少种. [ ...

随机推荐

  1. java_一对一自由聊天

    客户端 package cn.qianfeng.kaoti03; import java.io.BufferedReader; import java.io.IOException; import j ...

  2. Calendar 类的应用

    上一篇 说的 Date 类 最主要的作用就是获得当前时间,同事这个类里面也具有设置时间以及一些其他的功能,但是由于本身设计的问题,这些方法却遭到众多的批评,不推荐使用,要推荐使用Calendar 类进 ...

  3. java学习笔记--1_常见输入输出语句熟悉篇章

    今天上oj,想来是准备做做算法和数据结构的.看了看以前做的基础题目,想着就先熟悉一下java的语言吧! 以下是今天做的10道题目. 备注:oj有时候对格式要求非常严格,因为不在格式上纠结太久,只要ec ...

  4. 关于安卓应用(APK文件)的二次打包

    http://blog.csdn.net/baiyuliang2013/article/details/40426681 很多开发者,不管是个人或是公司都不太注重自己开发的应用的安全性,即是 否会被不 ...

  5. onMouseDown onMouseUp onMouseMove(移动鼠标图像大小变化)

  6. 关于AVAudioPlayer

    IOS中有三种播放音频的方式:AVAudioPlayer.音频服务.音频队列. 此文主要讲AVAudioPlayer,其他两个请见相关文章. AVAudioPlayer在AVFoundation框架下 ...

  7. swift-06-字符串,字符以及元组类型

    1.字符串和字符类型 //在swift中,字符串使用一对双引号括起来 var str = "hello M.SD-DJ" print(str) //字符也要用双引号括起来,用cha ...

  8. .net 安卓IOS跨平台des加解密双向的(可以互相加解密)

    #region 跨平台加解密(c# 安卓 IOS) // public static string sKey = "12345678"; // /// // /// 解密 // / ...

  9. c语言指针字符串与字符数组字符串的区别

    #include <stdio.h> int main() { //字符串常量,存放于内存常量区. //常量区区的内存具有缓存机制, //当不同指针指向的常量值相同时, //其实这些指针指 ...

  10. NET异步调用Webserver

    之前,有个同事跑来问我一堆的什么多线程异步进行调用Sap的服务再突然把进程关闭,还说要设置一个循环判断调用的结果,搞得我听的一头雾水,但是我明显感觉到他的设计思路已经渐行渐远了...已经再偏远的山区中 ...