组合数学中的项链计数
2015-09-18 11:12
190 查看
给c种不同颜色宝石能穿成多少种长度为s的宝石项链(本质不同)
Burnside定理的应用:
当n为奇数时,有n种翻转,每种翻转都是以一个顶点和该顶点对边的中点对称。有k^(n/2+1)*n种。
当n为偶数时,有n种翻转,其中一半是以两个对应顶点,另一半是以两条对边对称。有k^(n/2+1)*n/2+k^(n/2)*n/2种。
考虑旋转:枚举旋转角度360/n*i,(0<i<=n),也就是一个置换。经过该置换,颜色仍保持不变的着色方案有k^GCD(n,i)种。
一个长度为n的环,每i个上同一种颜色,可以上多少种颜色。
假设起点在x,则x,x+i,x+2*i,……,x+k*i,……
假设在第t次,第一次回到起点,则x=(x+t*i)%n => t*i%n=0 => t=LCM(i,n)/i=n*i/GCD(n,i)/i=n/GCD(n,i)。
那么可以上n/t种颜色,即n/(n/GCD(n,i))种,所以旋转的着色方案有k^GCD(n,i)种。
Burnside定理的应用:
当n为奇数时,有n种翻转,每种翻转都是以一个顶点和该顶点对边的中点对称。有k^(n/2+1)*n种。
当n为偶数时,有n种翻转,其中一半是以两个对应顶点,另一半是以两条对边对称。有k^(n/2+1)*n/2+k^(n/2)*n/2种。
考虑旋转:枚举旋转角度360/n*i,(0<i<=n),也就是一个置换。经过该置换,颜色仍保持不变的着色方案有k^GCD(n,i)种。
一个长度为n的环,每i个上同一种颜色,可以上多少种颜色。
假设起点在x,则x,x+i,x+2*i,……,x+k*i,……
假设在第t次,第一次回到起点,则x=(x+t*i)%n => t*i%n=0 => t=LCM(i,n)/i=n*i/GCD(n,i)/i=n/GCD(n,i)。
那么可以上n/t种颜色,即n/(n/GCD(n,i))种,所以旋转的着色方案有k^GCD(n,i)种。
#include<cstdio> #include<iostream> using namespace std; typedef long long ll; ll power(ll a,ll b) { ll ans=1ll; while(b) { if(b&1) ans=ans*a; a=a*a; b=b>>1; } return ans; } ll gcd(ll a,ll b) { return b ? gcd(b,a%b) : a; } int main() { int c,s; ll ans; while(scanf("%d%d",&c,&s)!=EOF) { if(s&1) ans=power(c,s/2+1)*s; else ans=power(c,s/2)*(s/2)+power(c,s/2+1)*(s/2); for(int i=1;i<=s;i++) ans+=power(c,gcd(s,i)); printf("%lld\n",(ans/2)/s); } return 0; }
相关文章推荐
- javascript经典 面试题及答案
- 找呀志_ContentResolver操作ContentProvider数据
- 使用iScroll时,input等不能输入内容的解决方法(share)
- wpf绑定之格式化日期
- 11种ASP连接数据库的方法
- 【代码】如何在手机等移动平台上浏览器网页中点击链接跳转到QQ聊天界面
- C语言之break和continue
- mysql 卖家数据 查询模板 放在博客里 方便使用
- 仿QQ顶部圆角页面切换Button
- javascript闭包
- Kafka启动,显示内存不足,修改内存项
- Channel Allocation (poj 1129 dfs)
- 使用限定符
- Objective-C对象和Core Foundation 对象
- 思科3750_IOS批量升级
- word2007不显示“审阅”选项卡
- DataNode-- Initialization failed for block pool Block pool BP-1088120134-127.0.1.1-1441936318521
- leetcode pascal's triangle
- Java自动化测试之测试常用功能集集锦(UiAutomator、Selenium等)
- Android面试准备:内存泄露和内存溢出