오일러 파이 함수를 통해서 풀면
파이는 1~n까지의 수 중에서 n과 서로소인 수의 갯수이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 | #include <cstdio> #include <iostream> #include <math.h> using namespace std; int prime[50]; int primeCopy[50]; int primeCopy2[50]; int primeCopyPower[50]; void function(int firstInputNumber) { int i, primeIndex, inputNumber; int x; primeIndex = 0; inputNumber = firstInputNumber; //소인수분해 for(i = 2; i < inputNumber; i++) { if(inputNumber % i == 0) { prime[primeIndex] = i; primeIndex++; inputNumber /= i; i = 1; } } x = inputNumber; i = 0; while(firstInputNumber != x) { x = x * prime[i]; i++; } prime[i] = inputNumber; //primeCopy에는 소인수분해해서 최소공배수들이 모임 for(int j = 0; j <= i; j++){ primeCopy[j] = prime[j]; } //primeCopy2에는 소인수분해해서 최소공배수가 중복되지 않게 넣음 //primeCopyPower에는 각자의 최소공배수가 몇 개씩 있는지를 넣음 int k = 0; for(int j = 0; primeCopy[j] != 0; j++){ if(j != 0){ if(primeCopy[j] == primeCopy[j-1]){ primeCopyPower[k]++; }else{ k++; primeCopyPower[k]++; primeCopy2[k] = primeCopy[j]; } } else{ primeCopyPower[k]++; primeCopy2[k] = primeCopy[j]; } } } int main(){ int N; int result = 1; while(1){ cin >> N; if(N == 0) break; //initialization for(int k = 0; k < 50; k++){ prime[k] = 0; primeCopy[k] = 0; primeCopy2[k] = 0; primeCopyPower[k] = 0; result = 1; } function(N); //오일러의 파이 함수 정리 for(int j = 0; primeCopy2[j] != 0; j++){ result *= pow(primeCopy2[j], primeCopyPower[j]) - pow(primeCopy2[j], primeCopyPower[j]-1); } printf("%d\n", result); } return 0; } | cs |
'Algorithm Problems > BOJ' 카테고리의 다른 글
[11650번] 좌표 정렬하기 - sort [C++] (0) | 2017.09.19 |
---|---|
[11758번] CCW - CCW 알고리즘[C++] (0) | 2017.08.24 |
[1463번] 1로 만들기 - 동적계획법 [C++] (0) | 2017.05.11 |
[1780번] 종이의 개수 - 분할정복법 [C++] (1) | 2017.05.11 |
[1065번] 한수 - Bruth force & Search[C++] (0) | 2017.03.27 |