题解 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;
}
QwQwQ