下笔春蚕食叶声。

题解 UVA10294 【Arif in Dhaka (First Love Part 2)】

群置换。

共有两种置换,旋转和对称。


对于旋转,旋转i颗珠子时\((0<=i<n)\)

举例1,旋转4颗珠子

1 2 3 4 5 6

5 6 1 2 3 4

1-5-3 2-6-4

2个循环,每组3个

举例2,旋转3颗

1 2 3 4 5 6

4 5 6 1 2 3

1-4 2-5 3-6

3个循环,每组2个

循环数量:\(gcd(n,i)\)

这个我证不出来/dk,所有题解都说显然,要不就是举例论证。

每个循环内部都是同一种珠子,才能保证置换后整体不变。

每个循环贡献\(t^{gcd(n,i)}\)

\(a=\sum t^{gcd(n,i)}\)


对于对称,分成n为奇数和偶数两种情况。

奇数:

n个,切开一个珠子,即有\((n-1)/2\)个循环节为2,1个循环节为1的。相当于有\((n+1)/2\)个循环节。

\(b=n*t^{(n+1)/2}\)

偶数:

分两种情况。

1.n/2个,切开两个珠子。同理有\((n-2)/2+2\)\(n/2+1\)个循环节

2.n/2个,把珠子分成两半,n/2个循环节

\(b=(n/2)*(t^{n/2+1}+t^{n/2})\)

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL n,t,f[55];
LL power(LL x,LL y){
	return f[y];
}
LL xz(){
	LL ret=0;
	for(LL i=0;i<n;i++)
		ret+=power(t,__gcd(n,i));
	return ret;
}
LL dc(){
	LL ret=0; 
	if(n&1) ret+=n*power(t,(n+1)/2);
	else ret+=(n/2)*(power(t,n/2)+power(t,n/2+1));
	return ret;
}
int main(){
	while(scanf("%lld%lld",&n,&t)==2){
		f[0]=1;
		for(LL i=1;i<=n;i++) f[i]=f[i-1]*t;
		LL a=xz(),b=dc();
		printf("%lld %lld\n",a/n,(a+b)/(2*n));
	}
	return 0;
}

posted @ 2020-06-11 18:21  ACwisher  阅读(147)  评论(0编辑  收藏  举报