UVA11255 necklace (polya定理)
2016-11-06 17:26
363 查看
题目链接 http://vjudge.net/problem/18969/origin
题目大意:用三种颜色,蓝,黄,白各a,b,c个去染色a+b+c个珠子,珠子围成一个环,问能染成多少种不同的珠子。
旋转,翻转后的珠子算同一种。
该题限制了颜色的个数,略恶心。
旋转的方案数:(比较简单)
对于每一种翻转,可以发现每个循环节的大小 都是相同的,那么我们就可以用组合计数算一下。
对于翻转得方案数:(分类讨论)
一:n为偶数
(一)空心对称
(1)奇奇偶 (该方案数为0)
(2)偶偶偶
(二)实心对称
(1)奇奇偶
(2)偶偶偶
二:n为奇数
(一)实心对称
(1)奇奇奇 (该方案数为0)
(2)奇偶偶
(二)空心对称 (该方案数为0)
具体计数见代码
题目大意:用三种颜色,蓝,黄,白各a,b,c个去染色a+b+c个珠子,珠子围成一个环,问能染成多少种不同的珠子。
旋转,翻转后的珠子算同一种。
该题限制了颜色的个数,略恶心。
旋转的方案数:(比较简单)
对于每一种翻转,可以发现每个循环节的大小 都是相同的,那么我们就可以用组合计数算一下。
对于翻转得方案数:(分类讨论)
一:n为偶数
(一)空心对称
(1)奇奇偶 (该方案数为0)
(2)偶偶偶
(二)实心对称
(1)奇奇偶
(2)偶偶偶
二:n为奇数
(一)实心对称
(1)奇奇奇 (该方案数为0)
(2)奇偶偶
(二)空心对称 (该方案数为0)
具体计数见代码
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int maxn=50; typedef long long LL; LL C[maxn][maxn]; LL res; void init() { res=0; for(int i=0;i<maxn;i++) { C[i][0]=1; for(int j=1;j<=i;j++) C[i][j]=C[i-1][j]+C[i-1][j-1]; } } LL cal(int x,int y,int z,int sum,int xx) { if(x<0||y<0||z<0||x%xx||y%xx||z%xx)return 0; x/=xx,y/=xx,z/=xx,sum/=xx; return C[sum][x]*C[sum-x][y]; } int gcd(int a,int b) { return !b?a:gcd(b,a%b); } void counteven(int x,int y,int z,int n) { LL sum=0; int cnt=0;//奇数的个数 if(y%2)swap(x,y); if(z%2)swap(y,z); if(x%2)cnt++; if(y%2)cnt++; //实心对称+空心对称 1 1 2 2 2 2 2 ---------- 2 2 2 2 2 2 2 if(cnt==2)//奇奇偶 { x--,y--; sum+=2*cal(x,y,z,n-2,2);//实心 res+=sum*(n/2); } else//偶偶偶 { sum+=cal(x-2,y,z,n-2,2)+cal(x,y-2,z,n-2,2)+cal(x,y,z-2,n-2,2);//实心 sum+=cal(x,y,z,n,2);//空心 res+=sum*(n/2); } } void countodd(int x,int y,int z,int n) { int cnt=0;//偶数的个数 LL sum=0; if(y%2)swap(x,y); if(z%2)swap(x,z); if(x%2==0||y%2==0||z%2==0)cnt=2; else cnt=0; //奇数只有实心对称 1 2 2 2 2 2 2 2 2 sum+=cal(x-1,y,z,n-1,2);//奇偶偶 res+=sum*n;//因为有n条对称轴 } int main() { init(); int T; scanf("%d",&T); while(T--) { res=0; int x,y,z,n,cnt=0; scanf("%d%d%d",&x,&y,&z); n=x+y+z; //旋转的 for(int i=1;i<=n;i++) { int gc=gcd(i,n); int num=n/gc; if(x%num||y%num||z%num)continue; res+=cal(x,y,z,n,num); } //对称翻转的 if(n%2)countodd(x,y,z,n),cnt=2*n; else counteven(x,y,z,n),cnt=2*n; printf("%lld\n",res/cnt); } }
相关文章推荐
- uva 11255 Necklace (polya)
- Necklace UVA - 11255(polya计数)
- UVA 11255 Necklace(Polya)
- uva 10284 - Arif in Dhaka(First Love Part)等价类计数(Polya定理)
- poj 1286 Necklace of Beads & poj 2409 Let it Bead(初涉polya定理)
- Polya 定理练习题 分类: uva 2015-06-17 22:13 28人阅读 评论(0) 收藏
- hdu 1817 Necklace of Beads(Polya定理)
- UVA - 10294 Arif in Dhaka (First Love Part 2) (置换群-polya定理- 数学推导循环节)
- poj 1286 Necklace of Beads(Polya定理)
- [UVA 10294] polya定理 可循环翻转项链手镯问题
- UVA - 10294 Arif in Dhaka (First Love Part 2) (Polya定理)
- uva11255 - Necklace 项链旋转翻转 置换
- uva 11255 Necklace
- UVA 10733 - The Colored Cubes【Polya定理】
- UVA 11255 - Necklace(Ploya)
- POJ 题目1286 Necklace of Beads(Polya定理)
- hdu 1817 Necklace of Beads(Polya定理)
- uva 11255 - Necklace(置换)
- HDU1817 Necklace of Beads【Polya定理】
- POJ 1286 Necklace of Beads(Polya定理)