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. HDU1010(bfs)

    #include <stdio.h>#include <iostream>#include <string.h>#include <stdlib.h>u ...

  2. Java基础知识强化之IO流笔记44:IO流练习之 复制图片的 4 种方式案例

    1. 复制图片的 4 种方式案例: 分析: 复制数据,如果我们知道用记事本打开并能够读懂,就用字符流,否则用字节流. 通过该原理,我们知道我们应该采用字节流. 而字节流有4种方式,所以做这个题目我们有 ...

  3. WinForm界面(一)

    一:Form对象 属性: 设计中的Name:窗体类的类名AcceptButton:窗口的确定按钮CancelButton:窗口按ESC的取消按钮 1.外观 Backcolor:背景颜色Forecolo ...

  4. .NET笔记系列:LAMBDA表达式常用写法

    这里主要是将数据库中的常用操作用LAMBDA表达式重新表示了下,用法不多,但相对较常用,等有时间了还会扩展,并将查询语句及LINQ到时也一并重新整理下: 1.select语句:books.Select ...

  5. Angularjs中使用$location获取url参数时,遇到的坑~~~

    今天在开发时候,需要用到Angularjs1.4.6获取url参数,网上查了一下,有部分文章提到用$location来获取.大致方法如下 var app = angular.module('myApp ...

  6. Use AUTO Mode with FOR XML (SQL Server 2012) Multiple Table

    SELECT Cust.CustomerID, OrderHeader.CustomerID, OrderHeader.SalesOrderID, OrderHeader.Status FROM Sa ...

  7. asp.net 用jquery判断fileupload上传文件的大小和类型和名字

    <script language="javascript" type="text/javascript"> //检查上传文件大小和获取文件名 fun ...

  8. UIView转场动画属性设置

    常规动画属性设置(可以同时选择多个进行设置) UIViewAnimationOptionLayoutSubviews:动画过程中保证子视图跟随运动. UIViewAnimationOptionAllo ...

  9. AudioStreamer使用之快速点击下/上一首按钮,音频会重复的问题解决。

    针对此问题,我的做法是在AudioStreamer.h文件新加入一个属性 @property (nonatomic,strong) NSURL *musicUrl; 和一个单例方法: +(id)sha ...

  10. javax.el.PropertyNotFoundException: Property 'aDesc' not found on type

    这个问题是是在我使用jeesite自动代码是产生的,原因是实体类的属性命名规范不合格,我在网上看到类的属性前三个字母不能出现大写 解决办法:将类的属性大小写改一下