组合计数(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)*Inv(Mod%x)%Mod;}
 9 LL Gcd(LL a,LL b){return b?Gcd(b,a%b):a;}
10 void DFS(int d,int c,int l){
11     if(c==0){
12         LL tot=1;int t=0;
13         for(int i=1;i<=d;i++)
14             tot=tot*Inv(st[i])%Mod;
15         for(int i=1;i<=d;i++)
16             if(st[i]!=st[i-1]){
17                 tot=tot*ifac[t]%Mod;
18                 t=1;
19             }
20             else t+=1;
21         tot=tot*ifac[t]%Mod;
22         for(int i=1;i<=d;i++)
23             tot=tot*pow[st[i]/2]%Mod;
24         for(int i=1;i<=d;i++)
25             for(int j=i+1;j<=d;j++)
26                 tot=tot*pow[Gcd(st[i],st[j])]%Mod;
27         ans=(ans+tot)%Mod;
28     }
29     for(int i=l;i<=c;i++)
30         st[d+1]=i,DFS(d+1,c-i,i);
31 }
32 int main(){
33     scanf("%I64d%I64d%I64d",&n,&m,&Mod);
34     pow[0]=fac[0]=ifac[0]=1;
35     for(int i=1;i<=n;i++){
36         fac[i]=1ll*fac[i-1]*i%Mod;
37         pow[i]=pow[i-1]*m%Mod;
38         ifac[i]=Inv(fac[i]);
39     }
40     DFS(0,n,1);printf("%I64d\n",ans);
41     return 0;
42 }
时间: 2024-12-26 08:28:21

组合计数(polya计数):SGU 282 Isomorphism的相关文章

组合数学及其应用——polya计数

在处理类似下面的问题中,一般的计数方法会出现问题:假如你要用红.蓝两种颜色给一个正四面体的四个顶点着色,试问存在多少种不同的着色方案? 在高中我们常用的方法是模拟涂色过程,分情况讨论,然后基于分步乘法原理.但是在那里没有考虑几何体通过旋转等操作带来的对称性,在本文中,我们就来介绍一种专门处理这类问题的工具——Polya计数. 首先我们要做的是引入一些基本的概念. 置换: 关于置换更多的细节我们在<抽象代数基础教程>中继续讨论,这里我们只需简单的了解其概念即可. 关于置换还需要了解的就是它的合乘

UVALive - 3641 Leonardo&#39;s Notebook(polya计数)

题意:给出26个大写字母的置换B,问是否存在一个置换A,使A*A=B? 两个长度为N的相同循环相乘,当N为奇数时结果也是一个长度为N的循环,当N为偶数时分裂为两个长度为N/2的循环.相反,对于一个任意长度为N的奇数循环B,都能找到一个长度为N的循环A使得A*A=B,对于任意两个长度为N(N不一定为偶数)的不相交循环B和C,都能找到一个长度为2N的循环A使得A*A=B*C. 于是只要判断置换B里循环长度相同的且都为偶数(2,4,6, 8.....)的循环个数是不是都为偶数(偶数就能两两配对),只要

[ACM] POJ 2154 Color (Polya计数优化,欧拉函数)

Color Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7630   Accepted: 2507 Description Beads of N colors are connected together into a circular necklace of N beads (N<=1000000000). Your job is to calculate how many different kinds of th

HDU 4633(polya计数

题目:用k种颜色给一个魔方染色,可以染每个面的9个小矩形,12条棱,8个顶点(总之就是有74个能染的地方),空间旋转后一样的视为相同,问有多少种不同的染色方案. 思路:裸的polya计数,但是这个立方体的对称群本来就很容易弄错...<组合数学>里有个例题提到立方体的对称群有24个元素,分别是: (1)恒等变换. (2)以两个相对面的中心相连作为对称轴,旋转(i)90,(ii)180,(iii)270度,每种有3个.共9种. (3)以两个相对棱的中点连线为对称轴翻转180度,有6种. (4)固定

poj 2154 Color(polya计数 + 欧拉函数优化)

http://poj.org/problem?id=2154 大致题意:由n个珠子,n种颜色,组成一个项链.要求不同的项链数目,旋转后一样的属于同一种,结果模p. n个珠子应该有n种旋转置换,每种置换的循环个数为gcd(i,n).如果直接枚举i,显然不行.但是我们可以缩小枚举的数目.改为枚举每个循环节的长度L,那么相应的循环节数是n/L.所以我们只需求出每个L有多少个i满足gcd(i,n)= n/L,就得到了循环节数为n/L的个数.重点就是求出这样的i的个数. 令cnt = gcd(i,n) =

[ACM] POJ 2409 Let it Bead (Polya计数)

Let it Bead Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4434   Accepted: 2916 Description "Let it Bead" company is located upstairs at 700 Cannery Row in Monterey, CA. As you can deduce from the company name, their business is b

[ACM] POJ 1286 Necklace of Beads (Polya计数,直接套公式)

Necklace of Beads Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6547   Accepted: 2734 Description Beads of red, blue or green colors are connected together into a circular necklace of n beads ( n < 24 ). If the repetitions that are pro

Polya计数

Let it Bead Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5365   Accepted: 3585 Description "Let it Bead" company is located upstairs at 700 Cannery Row in Monterey, CA. As you can deduce from the company name, their business is b

sgu294:He&#39;s Circles(polya计数+高精度)

题目大意: 一个长度为 n(1≤n≤200000) 的环由 0 or 1 组成,求有多少本质不同的环. 分析: (这题有可能更侧重于考高精度) 考虑循环节的个数只可能为 n 的约数,且循环节的个数为 d 的置换会出现 φ(n/d) 次,所以答案就是: Σ2dφ(n/d)n (好大的公式...) 高精度压压位,优化一下常数就过了. AC code: #include <bits/stdc++.h> #define pb push_back #define mp make_pair #define