정수론 문제 풀다가 자주 보여서 복습 겸 작성
PS 풀면서 자주 활용되는 함수로 주요한 성질들은 다음과 같다.
-> p는 소수이기 때문에 1 ~ (p-1)은 전부 p와 서로소이다.
->
-> 생략
-> 1, 2 참고
즉 아래와 같은 식을 얻을 수 있다.
int prime[1000000];
void f1(long long n) {
int x = (int)sqrt(n);
for (int i = 2; i <= x; i++)
if (!prime[i])
for (int j = i * i; j <= x; j += i)
prime[j] = 1;
}
long long phi(long long n) {
if (n == 1)return 0;
long long x = (long long)sqrt(n),res = 1;
for (long long i = 2; i <= x; i++) {
long long a = 0;
if (!prime[i] && (n % i) == 0) {
while (n % i == 0) {
a++;
n /= i;
}
res *= ((i - 1) * pow(i, a- 1));
}
if (n == 1)break;
}
if (n > 1)
res *= (n - 1);
return res;
}
백준 11689번 : GCD(n, k) = 1
https://www.acmicpc.net/problem/11689
#include <stdio.h>
#include<math.h>
typedef long long ll;
int prime[1000000];
void f1(ll n) {
ll x = (ll)sqrt(n);
for (ll i = 2; i <= x; i++)
if (!prime[i])
for (ll j = i * i; j <= x; j += i)
prime[j] = 1;
}
ll f2(ll n) {
ll x = (ll)sqrt(n), res = 1;
for (ll i = 2; i <= x; i++) {
int a = 0;
if (!prime[i] && (n % i) == 0) {
while (n % i == 0) {
a++;
n /= i;
}
res *= ((i - 1) * pow(i, a - 1));
}
if (n == 1)break;
}
if (n > 1)res *= (n - 1);
return res;
}
int main() {
ll n;
scanf("%lld", &n);
f1(n);
printf("%lld", f2(n));
}
백준 4355번 : 서로소
https://www.acmicpc.net/problem/4355
#include <stdio.h>
#include<math.h>
int prime[100000];
void f1(int n) {
int x = (int)sqrt(n);
for (int i = 2; i <= x; i++)
if (!prime[i])
for (int j = i * i; j <= x; j += i)
prime[j] = 1;
}
int f2(int n) {
if (n == 1)return 0;
int x = (int)sqrt(n), res = 1;
for (int i = 2; i <= x; i++) {
int a = 0;
if (!prime[i] && (n % i) == 0) {
while (n % i == 0) {
a++;
n /= i;
}
res *= ((i - 1) * pow(i, a - 1));
}
if (n == 1)break;
}
if (n > 1)res *= (n - 1);
return res;
}
int main() {
int n;
f1(1000000000);
while (1) {
scanf("%d", &n);
if (n == 0)break;
printf("%d\n", f2(n));
}
return 0;
}