日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

polay定理总结

發(fā)布時間:2024/4/13 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 polay定理总结 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

參考資料:polay定理

感覺近期一直easy遇見這樣的題目....... 略微復(fù)雜一點的就不太會

先是一個總結(jié)出來的定理:

用一個最簡單的樣例來說明

對2*2的方陣用黑白兩種顏色涂色,問能得到多少種不同的圖像?經(jīng)過旋轉(zhuǎn)使之吻合的兩種方案,算是同一種方案。

設(shè)G={p1,p2,…,pg}是Ω上的一個置換群比方置換群G={轉(zhuǎn)0°。轉(zhuǎn)90°,轉(zhuǎn)180°,轉(zhuǎn)270°}

C(pk)是置換pk的循環(huán)的個數(shù) ?

G1置換{轉(zhuǎn)0° ?}的循環(huán)節(jié)是4。 {(1),(2),(3),(4)}

G2置換{轉(zhuǎn)90° }的循環(huán)節(jié)是1, {(4,3,2,1)}

G3置換{轉(zhuǎn)180°}的循環(huán)節(jié)是2, {(1,3),(2,4)}

G4置換{轉(zhuǎn)270°}的循環(huán)節(jié)是1。 {(1,2,3,4)}

用M中的顏色對Ω中的元素著色,
著色方案數(shù)為 L = 1/|G|*[c1(p1)+c1(p2)+c1(p3)+...c1(p[g])]?

? ? ? ?= 1/|G|*[m^c(p1)+m^c(p2)+m^c(p3)+...m^c(p[g])]

|G|為置換的總個數(shù),m顏色數(shù)?

c1(pi)指置換pi的不動點的數(shù)目(既循環(huán)節(jié)為1的點數(shù))


明顯四個數(shù)分別為 16 2 4 2?

L = 1/|G| * [16 + 2 + 4 + 2] = 6

c(pi)指的是置換pi的循環(huán)個數(shù)。

L = ?1/|G| *[ 2^4 + 2^1 + 2^2 + 2^1 ] = 6?


先來一個簡單的題目:

poj 2409 :?http://poj.org/problem?

id=2409

題目大意:?

一家項鏈公司生產(chǎn)手鐲。n顆珠子形成一個環(huán),用m種顏色給n顆珠子染色,就得到了各種各樣的手鐲。可是,經(jīng)過旋轉(zhuǎn)和翻轉(zhuǎn)使之吻合的算同一種方案。

比如,當(dāng)用2種顏色對5顆珠子進(jìn)行染色的方案數(shù)為8。

題目解法:


一: 旋轉(zhuǎn) (比方說是有n個珠子。每次能夠旋轉(zhuǎn)的角度就是360/n)

二: 翻轉(zhuǎn) (考慮對稱軸。奇數(shù)個珠子,那每次對稱軸能夠穿過一個珠子。則一共同擁有n個對稱軸)

偶數(shù)個珠子,每一個對稱軸穿過的是兩個珠子,一共同擁有n/2個對稱軸,或者說每一個對稱軸不穿過珠子,這種對稱軸也是n/2個

所以綜上來說無論是奇數(shù)或者偶數(shù)。其變化方式都是有2*n種翻轉(zhuǎn)。


能夠證明的是每個翻轉(zhuǎn)其循環(huán)節(jié)各自是gcd(i,n) ?0<i<=n

#include <iostream> #include <stdio.h> #include <string.h> #include <math.h> using namespace std;int gcd(int a,int b){return b==0?a:gcd(b,a%b); }long long rotate(int c,int n){ //旋轉(zhuǎn) 旋轉(zhuǎn) (360/n) * i 度long long sum=0;for(int i=1;i<=n;i++) sum+=pow(c*1.0,gcd(n,i)); //每次旋轉(zhuǎn)的循環(huán)節(jié)是gcd(n,i)return sum; }long long turn(int c,int n){ //翻轉(zhuǎn)long long sum=0;if(n%2)sum+=n*pow(c*1.0,(n+2)/2); //奇數(shù)則對稱軸都是穿過一個珠子 一共n個 每一個置換的循環(huán)節(jié)是n/2+1elsesum+=n/2*(pow(c*1.0,n/2)+pow(c*1.0,(n+2)/2)); //偶數(shù)則穿過珠子或者不穿過珠子 各自是n/2 個 循環(huán)節(jié)是n/2+1 和 n/2 能夠用下面公式算出return sum; }void polya(int c,int n){int i,j;long long sum=0;sum+=rotate(c,n);sum+=turn(c,n);printf("%lld\n",sum/(2*n)); }int main() {int n,m;while(scanf("%d%d",&n,&m),n||m){polya(n,m);}return 0; }

#include<cstring> #include<string> #include<fstream> #include<iostream> #include<iomanip> #include<cstdio> #include<cctype> #include<algorithm> #include<queue> #include<map> #include<set> #include<vector> #include<stack> #include<ctime> #include<cstdlib> #include<functional> #include<cmath> using namespace std; #define PI acos(-1.0)#define eps 1e-7 #define INF 0x7FFFFFFF #define LLINF 0x7FFFFFFFFFFFFFFF #define seed 1313131 #define MOD 1000000007 #define ll long long #define ull unsigned ll #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1//求置換的循環(huán)節(jié),polya原理 //perm[0..n-1]為0..n-1的一個置換(排列) //返回置換最小周期,num返回循環(huán)節(jié)個數(shù) #define MAXN 1000int gcd(int a,int b){return b?gcd(b,a%b):a; }int polya(int* perm,int n,int& num){int i,j,p,v[MAXN]={0},ret=1;for (num=i=0;i<n;i++)if (!v[i]){for (num++,j=0,p=i;!v[p=perm[p]];j++)v[p]=1;ret*=j/gcd(ret,j);}return ret; }int main (){int perm1[6]={0,5,4,3,2,1};int perm2[6]={1,0,5,4,3,2};int num;cout<<polya(perm2,6,num)<<endl;cout<<num<<endl; }






版權(quán)聲明:本文博客原創(chuàng)文章。博客,未經(jīng)同意,不得轉(zhuǎn)載。

總結(jié)

以上是生活随笔為你收集整理的polay定理总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。