标签:
会了,会了,终于会了
下面 项链,手镯以例子进行解释
关键就是置换群,循环节
区别就是手镯可以翻转,但是项链不可以
题例:输入整数n和t,输出用t种颜色的n颗珠子(每种颜色的珠子的数目没有限制,但是珠子的总数必须是n)能制出的 项链和珠子的个数
旋转:
如果逆时针旋转i颗 珠子的间距,则珠子0,i,2i,,,,构成一个循环。这个循环有n/gcd(i,n)个元素,根据对称性,所有的循环均相同,因此一共有gcd(i,n)个循环
这些置换的不动点总数为for(i=1;i<=n;i++) gcd(i,n)
t
翻转:
需要分这种情况讨论,当n为奇数时,对称轴有n条,每条对称轴形成(n-1)/2个长度为2的循环和1个长度为1的循环即(n+1)/2个循环,这些置换的不动点总数为
(n+1)/2
nt
当n为偶数的时候,有两种对称轴,穿过珠子的对称轴有n/2条,各形成n/2-1个长度为2的循环和2个长度为1的循环,不穿过珠子的对称轴有n/2条,各形成n/2个长度为2的循环
这些置换的不动点总数为 (n/2+1+n/2)
n/2t t
根据polya定理,项链总数为a/n,手镯总数为(a+b)/2n
代码随便 写的 一个
int main()
{
int n,t;
while(cin>>n>>t){
ll pow[maxn];
pow[0]=1;
for(int i=1;i<=n;i++){
pow[i]=pow[i-1]*t;
}
ll a=0;
for(i=0;i<n;i++){
a+=pow[gcd(i,n)];
}
ll b=0;
if(n%2==1){
b=n*pow[(n+1)/2];
}
else{
b=n/2*(pow[n/2+1]+pow[n/2]);
}
cout<<a/n<<‘ ‘<<(b+a)/2/n<<endl;
}
return 0;
}
标签:
原文地址:http://www.cnblogs.com/ACWQYYY/p/4562066.html