우리는 하나의 숫자가 (109 ^ 109)만큼 클 수 있는 두 숫자의 GCD를 찾아야 하며, 이는 long 또는 기타와 같은 일부 데이터 유형에 저장할 수 없습니다. 따라서 숫자가 a =10248585, n =1000000, b =12564이면 GCD(a^n, b)의 결과는 9가 됩니다.
숫자가 매우 길기 때문에 유클리드 알고리즘을 사용할 수 없습니다. O(log n) 복잡성의 모듈식 지수를 사용해야 합니다.
예시
#include<iostream> #include<algorithm> using namespace std; long long power(long long a, long long n, long long b) { long long res = 1; a = a % b; while (n > 0) { if (n & 1) res = (res*a) % b; n = n>>1; a = (a*a) % b; } return res; } long long bigGCD(long long a, long long n, long long b) { if (a % b == 0) return b; long long exp_mod = power(a, n, b); return __gcd(exp_mod, b); } int main() { long long a = 10248585, n = 1000000, b = 12564; cout << "GCD value is: " << bigGCD(a, n,b); }
출력
GCD value is: 9