Koder / 박성훈
article thumbnail

오일러 피 함수의 구현과 그 응용 문제

https://www.acmicpc.net/problem/19577

 

19577번: 수학은 재밌어

xφ(x) = n을 만족하는 양의 정수 x가 존재하면 최소의 x를, 존재하지 않으면 −1을 출력한다.

www.acmicpc.net

모든 수에 대해서 xF(x) 를 구하려 하면 TLE 가 발생한다.

이를 해결하기 위해서는 x도 정수, F(x)도 정수임을 이용해

x에 들어갈 수를 N의 약수로 한정지으면 문제를 해결할 수 있다.

 

그리고 N==1일때 코너케이스가 발생해 이부분을 따로 처리해주었다.

 

#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;

map<ll,ll> prime;
vector<ll> v;

int main(){
	ll n;
	scanf("%lld", &n);
	if(n==1){
		printf("1");
		return 0;
	}
	
	for(ll i=1; i*i<=n; i++){
		if(n%i == 0){
			v.push_back(n/i);
			v.push_back(i);
		}
	}
	
	for(int i=0; i<v.size(); i++){
		prime.clear();
		ll ans = 1;
		ll tmp = 2;
		ll val = v[i];
		while(tmp*tmp <= val){
			if(val%tmp == 0){
				prime[tmp]++;
				val /= tmp;
				continue;
			}
			tmp++;
		}
		prime[val]++;
		
		for(auto it=prime.begin(); it!=prime.end(); it++){
			ans *= ((ll)pow(it->first, it->second) - (ll)pow(it->first, it->second-1));
		}
		if(ans * v[i] == n){
			printf("%lld", v[i]);
			return 0;
		}
	}
	printf("-1");
	return 0;
}
반응형