1. 程式人生 > >10294 Arif in Dhaka (First Love Part 2)

10294 Arif in Dhaka (First Love Part 2)

連結

定理介紹

Burnside引理

對於一個置換ff,若一個著色方案ss經過置換後不變,則ssff的一個不動點,將ff的不動點的數目記作C(f)C(f),那麼等價類的數目就是C(f)C(f)的平均數

Pólya定理

假設有kk種顏色,如果置換ff能寫成m(f)m(f)種迴圈,那麼等價類的個數就是km(f)k^{m(f)}的平均數

題解

對於項鍊,顯然我們有nn種置換,我們給項鍊編號為0,1,...,n10,1,...,n-1,對於一種置換如果我把每顆珠子向後移ii的距離,那麼這棵珠子會移到0,gcd(n,i),2gcd(

n,i),...,(ngcd(n,i)1)gcd(n,i)0,gcd(n,i),2gcd(n,i),...,(\frac{n}{gcd(n,i)}-1)gcd(n,i) 這個迴圈中的元素個數為ngcd(n,i)\frac{n}{gcd(n,i)} 此置換共有gcd(n,i)gcd(n,i)個迴圈 所以項鍊個數就是i=0n1tgcd(n,i)n\frac{\sum_{i=0}^{n-1}t^{gcd(n,i)}}{n} 對於手鐲,又多了對稱這種置換 當n
n
為奇數時,有nn條對稱軸,每種置換迴圈的個數為m(f)=n2+1m(f)=\lfloor\frac{n}{2}\rfloor+1 所以答案就是i=0n1tgcd(n,i)+ntn2+12n{\sum_{i=0}^{n-1}t^{gcd(n,i)}+nt^{\lfloor\frac{n}{2}\rfloor+1}}\over{2n}nn為偶數時,有穿過點和穿過軸的兩種對稱軸,最終算出答案是 i=0n1tgcd(n,i)+n2tn2+1+n2tn22n{\sum_{i=0}^{n-1}t^{gcd(n,i)}+\frac{n}{2}t^{\lfloor\frac{n}{2}\rfloor+1}+\frac{n}{2}t^{\lfloor\frac{n}{2}\rfloor}}\over{2n}

程式碼

//置換 polya定理
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll fastpow(ll a, ll b)
{
	ll t=a, ans=1;
	for(;b;b>>=1,t=t*t)if(b&1)ans*=t;
	return ans;
}
ll gcd(ll a, ll b){return !b?a:gcd(b,a%b);}
int main()
{
	ll n, t, ans, i;
	while(~scanf("%lld%lld",&n,&t))
	{
		ans=0;
		for(i=0;i<n;i++)ans+=fastpow(t,gcd(n,i));
		printf("%lld ",ans/n);
		if(n&1)ans+=n*fastpow(t,n/2+1);
		else ans+=n/2*fastpow(t,n/2)+n/2*fastpow(t,n/2+1);
		printf("%lld\n",ans/n/2);
	}
	return 0;
}