UVA 10294 Arif in Dhaka (置换polya)

【题目链接】:click here~~

【题目大意】:

给你一串珠子(连接成了一个环),共有n个珠子组成,你有t种颜色,现在你来给这个珠子染色,问染成项链有多少种方法?染成手镯有多少种方法?在项链里,经过顺时针旋转后相同的算一个,在手镯里,经过顺时针旋转或者沿着对称轴兑换后一样的算一个。即不同之处在于项链不能够反转,而手镯可以反转。

【思路】:

首先,我们来看看两个很有用的关于置换的定理,第一个就是Burnside 描述为:对于置换f,一种着色方案s经过一种置换后不变,则称这种着色方案s是f的不动点。若将f的不动点计为C(f),则可以证明等价类数目为所有C(f)的平均值。

一般用这个引理就可以解决所有的问题了。

而Polya定理是这样给出的:如果置换f可以分解成m(f)个循环的乘积,那么每个循环内的颜色必须相同(必须的,不信则可以自己试验一下),假设有t中颜色,那么C(f)= t^(m(f)),则等价类数目也可求得。

而这个题目就是非常经典的置换的题目(等价统计类问题),只不过对于手镯来说,你就要注意手镯是可以旋转,也可以翻转的,所以最后是要加上旋转的数目,并且奇偶是不同的两种情况。

一共有两种置换:旋转和翻转,其中项链只有第一种,而手镯两种都有,假定所有珠子按照逆时针编号:0~n-1.

旋转:如果逆时针旋转i颗珠子的间距,则珠子0,i,2i,,,构成一个循环,这个循环共有n/gcd(i,n),为什么?留给读者自己思考,那么由对称性,所有循环节的长度均是相同的,因此一共有gcd(i,n)个循环,总数为:a=fac[i] = t^gcd(i ,n)

翻转:当n&1:对称轴有n条,每条对称轴形成(n-1)/2个长度为2的循环和1个长度为1的循环,即(n+1)/2个循环,则总数为b=n*t^(n+1)/2;

当n为偶数,有两种对称轴:穿过珠子的有(n/2)条,形成(n/2-1)个长度为2的循环和两个长度为1的循环;不穿过珠子的有(n/2)条,形成(n/2)个长度为2 的循环,则总数为b=n/2*(t^(n/2+1)+t^(n/2));

最后根据Polya定理:项链数为a/n,手镯数为(a+b)/2*n;

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;

int gcd(int a,int b){return b==0?a:gcd(b,a%b);}
LL fac[100000009];
int n,t;
LL a,b;
int main(){
    fac[0]=1;
    while(scanf("%d%d",&n,&t)==2&&n){
       a=b=0;
       for(int i=1; i<=n; ++i) fac[i]=fac[i-1]*t;
       for(int i=0; i<n; ++i) a+=fac[gcd(i,n)];
       if(n&1) b=n*fac[(n+1)/2];
       else b=n/2*(fac[n/2+1]+fac[n/2]);
       printf("%lld %lld\n",a/n,(a+b)/2/n);
    } return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-10 04:08:06

UVA 10294 Arif in Dhaka (置换polya)的相关文章

UVa 10294 Arif in Dhaka (First Love Part 2) Polya定理

题目来源:UVa 10294 Arif in Dhaka (First Love Part 2) 题意:n颗珠子t种颜色 求有多少种项链和手镯 项链不可以翻转 手镯可以翻转 思路:Polya定理  题目就是求等价类 项链只能旋转 手镯可以旋转也可以翻转 根据定理 等价类的数量等于各个置换f的t^m(f)的平均数 m(f)是置换的循环节数 下面每次t^x x都是循环节数 下面考虑手镯 旋转翻转都算 对于旋转 可以旋转0,1,...,n-1 每一个置换的循环节为gcd(0,n), gcd(1,n),

uva 10294 - Arif in Dhaka (First Love Part 2)(置换)

题目链接:uva 10294 - Arif in Dhaka (First Love Part 2) 题目大意:项链和手镯都是由若珠子穿成的环形首饰,区别在于手镯可以翻转,但是项链不行.给定n和t,表示用t种颜色的n个珠子能制作的项链和手镯的个数. 解题思路:等价类计数,一共两种置换,旋转或者翻转. 旋转:枚举间距0,1,2,3-,n?1,所以不动点a=∑i=0n?1tgcd(n,i) 翻转:当n为奇数时,对称轴有n条,每条对称轴形成n?12个长度为2的循环和一个长度为1的循环,所以不动点b1=

UVA 10294 Arif in Dhaka (First Love Part 2) Polya计数

题目链接 Polya计数入门题 10294 Arif in Dhaka (First Love Part 2) Our hero Arif is now in Dhaka (Look at problem 10244 – First Love if you want to know more about Arif, but that information is not necessary for this problem. In short, Arif is a brilliant progr

UVA - 10294 Arif in Dhaka (First Love Part 2) (Polya定理)

Description Problem L Arif in Dhaka (First Love Part 2) Input: standard input Output: standard output Time Limit: 2 seconds Our hero Arif is now in Dhaka (Look at problem 10244 – First Love if you want to know more about Arif, but that information is

10294 - Arif in Dhaka (First Love Part 2) (数论置换)

UVA 10294 - Arif in Dhaka (First Love Part 2) 题目链接 题意:给定n个珠子,t种颜色, 问能组成几个项链和手镯(手镯能翻转,项链不能) 思路:利用Burnside求解,推理出旋转的循环个数是gcd(i, n),翻转的分为奇偶情况考虑 代码: #include <stdio.h> #include <string.h> const int N = 30; int t, next[N], vis[N], num[N]; char str[N

UVA - 10733 The Colored Cubes (置换)

All 6 sides of a cube are to becoated with paint. Each side is is coated uniformly with one color. When a selectionof n different colors of paint is available, how many different cubes can youmake? Note that any two cubes are onlyto be called "differ

uva 11330 - Andy&#39;s Shoes(置换)

题目链接:uva 11330 - Andy's Shoes 题目大意:小andy有很多鞋,穿完到处丢,后来他把所有鞋都放回鞋架排成一排,保证了鞋的左右交替,但是颜色混了.问说他至少移动多少次可以将鞋分类好. 解题思路:对应奇数位置为左鞋,偶数位置为右鞋,一双鞋只有一只左鞋和一只右鞋,保证不换左变鞋子,以左鞋的位置为基准换右边鞋子,对应右边鞋子的位置即为一个置换,将置换的循环分解为x个互不相干的循环,ans=n-x #include <cstdio> #include <cstring&g

uva 716 - Commedia dell&#39; arte(置换)

题目链接:uva 716 - Commedia dell' arte 题目大意:给定一个三维的八数码,0表示空的位置,问说是否可以排回有序序列. 解题思路:对于n为奇数的情况,考虑三维八数码对应以为状态下去除0的时候逆序对数,偶数的情况下,考虑将0的位置转移到(n,n,n)位置后对应序列的逆序对数.如果逆序对数为偶数即为可以,奇数不可以. #include <cstdio> #include <cstring> #include <algorithm> using na

UVA 11330 - Andy&#39;s Shoes(置换分解)

UVA 11330 - Andy's Shoes 题目链接 题意:andy有很多双鞋子,每双鞋子有一个编号,现在他把鞋子左右左右放回去,可是不能保证所有鞋子左边和右边是同一编号,现在要求用最少的交换次数,使得所有鞋子左右编号相同 思路:置换的分解,固定左边的鞋子,这样右边的鞋子就可以看成是放在哪个位置,然后根据这个求出每个循环的长度,最后每个循环长度-1的总和就是答案 代码: #include <cstdio> #include <cstring> int t, n, vis[10