[Ybt 금메달 내비게이션 8-5-2] 칼라 목걸이 2

컬러 목걸이 2

주제 링크 : ybt 금메달 내비게이션 8-5-2

일반적인 생각

m 개의 색 구슬의 경우 n을 넣어 목걸이를 만들고 몇 개의 독특한 색을 만들 수 있는지 물어볼 수 있습니다.
반복은 목걸이를 회전시킬 수 있고 중심 축을 따라 뒤집 으면 정확히 동일 할 수 있습니다.

아이디어

이 질문은 이제 -> 질문 <- 거의.

n, mn, m 때문에n ,m 이 다를 수 있으므로 이전에 사용한 공식을 공식화하는 방법을 직접 사용할 수 없다는 것을 알 수 있습니다.
그러나 그 범위는 매우 작기 때문에 우리는 그것을 폭력적으로 할 것입니다. 그러면 이것은 문제가되지 않습니다.

그러나 그것은 또한 중심 축을 따라 뒤집는 동작을 가지고 있습니다.
그런 다음 Polya 정리의 방향도 고려합니다.
그런 다음 이러한 종류의 중간 반전 (회문과 같은)이 발생하면 패리티 분류를 생각합니다.

길이가 홀수이면 중심 축이 점 (하나만)에 닿아 야하며, 다음은 (n − 1) / 2 (n-1) / 2입니다.( n1 ) / 2 2 점 루프1 1. 포인트 1 주기, 즉(n + 1) / 2 (( n+1 ) / 2 주기. 그러면 각 점을 중심 축이 닿는 점으로 사용할 수 있으므로 총nn이 있습니다.n 그러한 순열.

길이가 짝수이면 두 가지 가능성을 생각할 것입니다. 중심 축은 아무것도 닿지 않을 것이고 중심 축은 두 점에 닿을 것입니다.
둘 다 n / 2 n / 2n / 2 개의 순열, 건드릴 수없는n / 2 n / 2사이클이 있습니다.n / 2 , 2 를 만나는 루프는2 + (n − 2) / 2 = (n + 2) / 2 2+ (n-2) / 2 = (n + 2) / 22+( n2 ) / 2=( n+2 ) / 2

그런 다음 이렇게 누르세요.
(총 순열 수는 2 × n 2 \ x n2×n )

암호

#include<cstdio>
#define ll long long

using namespace std;

int n, m;
ll ans;

void csh() {
    
    
	ans = 0;
}

ll gcd(ll x, ll y) {
    
    //求gcd
	if (!y) return x;
	return gcd(y, x % y);
}

ll ksm(ll x, ll y) {
    
    //快速幂
	ll re = 1;
	while (y) {
    
    
		if (y & 1) re = re * x;
		x = x * x;
		y >>= 1;
	}
	return re;
}

int main() {
    
    
	scanf("%d %d", &m, &n);
	while (m || n) {
    
    
		csh();
		
		for (int i = 1; i <= n; i++) {
    
    
			ans += ksm(m, gcd(i, n));//旋转
		}
		if (n & 1) ans += n * ksm(m, (n + 1) / 2);//沿中轴线翻转(分奇偶讨论)
			else ans += n / 2 * ksm(m, n / 2) + n / 2 * ksm(m, (n + 2) / 2);
		
		ans /= n * 2;
		
		printf("%lld\n", ans);
		
		scanf("%d %d", &m, &n);
	}
	
	return 0;
}

추천

출처blog.csdn.net/weixin_43346722/article/details/114154083