博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
polya置换
阅读量:6342 次
发布时间:2019-06-22

本文共 2307 字,大约阅读时间需要 7 分钟。

POLYA定理的基本应用

题意:

有n个珠子围成的环,有t种颜色可以染这些珠子;
如果这个环可以旋转有几种办法;
如果这个环可以旋转,且可以翻转,有几种办法;

刘汝佳的分析:

       等价类计数问题。一共有两种置换,选择以及翻转。项链只有第一种置换,手镯则有两种置换。设所有珠子按逆时针编号0~n-1。

       旋转置换:如果逆时针旋转i颗珠子的间距,则珠子0、i、2i、…构成一个循环。这个循环有n/gcd(i,n)个元素。根据对称性,所有循环的长度相同,因此一共有n/(n/gcd(i,n)) = gcd(i,n)个循环。该置换的不动点数为t^(gcd(i,n))。所有置换的不动点总数为a = sum{t^gcd(i,n) | i = 0,1,…,n - 1}。

       翻转置换:分情况讨论。当n是奇数时,对称轴有n条,每条对称轴形成(n-1)/2个长为2的循环以及1个长为1的循环,即(n+1)/2个循环。这些置换的不动点总数是b=nt^((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) / (2n)。

1 #include
2 #define mp make_pair 3 #define pb push_back 4 #define first fi 5 #define second se 6 #define pw(x) (1ll << (x)) 7 #define sz(x) ((int)(x).size()) 8 #define all(x) (x).begin(),(x).end() 9 #define rep(i,l,r) for(int i=(l);i<(r);i++)10 #define per(i,r,l) for(int i=(r);i>=(l);i--)11 #define FOR(i,l,r) for(int i=(l);i<=(r);i++)12 #define eps 1e-913 #define PIE acos(-1)14 #define cl(a,b) memset(a,b,sizeof(a))15 #define fastio ios::sync_with_stdio(false);cin.tie(0);16 #define lson l , mid , ls17 #define rson mid + 1 , r , rs18 #define ls (rt<<1)19 #define rs (ls|1)20 #define INF 0x3f3f3f3f21 #define LINF 0x3f3f3f3f3f3f3f3f22 #define freopen freopen("in.txt","r",stdin);23 #define cfin ifstream cin("in.txt");24 #define lowbit(x) (x&(-x))25 #define sqr(a) a*a26 #define ll long long27 #define ull unsigned long long28 #define vi vector
29 #define pii pair
30 #define dd(x) cout << #x << " = " << (x) << ", "31 #define de(x) cout << #x << " = " << (x) << "\n"32 #define endl "\n"33 using namespace std;34 //**********************************35 int n,t;36 ll f[17];37 //**********************************38 void get(int n)39 {40 f[0]=1;41 FOR(i,1,n)f[i]=f[i-1]*t;42 }43 inline int gcd(int a,int b)44 {45 return b==0?a:gcd(b,a%b);46 }47 //**********************************48 int main()49 {50 while(~scanf("%d%d",&n,&t)){51 get(n);52 ll a=0,b=0;53 rep(i,0,n)a+=f[gcd(i,n)];54 if(n%2==1)b=n*(f[(n+1)/2]);55 else b=n/2*(f[n/2+1]+f[n/2]);56 printf("%lld %lld\n",a/n,(a+b)/2/n);57 }58 return 0;59 }
View Code

 

转载于:https://www.cnblogs.com/klaycf/p/9671243.html

你可能感兴趣的文章
[求助] win7 x64 封装 出现 Administrator.xxxxx 的问题
查看>>
人类投资经理再也无法击败电脑的时代终将到来了...
查看>>
一个最小手势库的实现
查看>>
HoloLens开发手记 - Vuforia开发概述 Vuforia development overview
查看>>
Android支付之支付宝封装类
查看>>
<亲测>CentOS中yum安装ffmpeg
查看>>
【分享】马化腾:产品设计与用户体验
查看>>
【机器学习PAI实践十】深度学习Caffe框架实现图像分类的模型训练
查看>>
全智慧的网络:思科十年来最具颠覆性的创新
查看>>
怎样将现有应用迁移到 VMware NSX
查看>>
赛门铁克收购以色列移动安全初创公司Skycure 旨在构建网络安全防御平台
查看>>
《Photoshop蒙版与合成(第2版)》目录—导读
查看>>
“最佳人气奖”出炉!4月27号,谁能拿到阿里聚安全算法挑战赛的桂冠?
查看>>
《网页美工设计Photoshop+Flash+Dreamweaver从入门到精通》——2.6 图层与图层样式...
查看>>
今天的学习
查看>>
面试必问之JVM原理
查看>>
mysql主主同步+Keepalived
查看>>
研究音频编解码要看什么书
查看>>
tomcat远程调试配置
查看>>
QuartZ Cron表达式
查看>>