득이공간

[백준 C++] 13172 Σ - 정수론 본문

PS/알고리즘 문제풀이

[백준 C++] 13172 Σ - 정수론

쟁득 2024. 3. 13. 11:10
 

13172번: Σ

모듈러가 11에서 1,000,000,007이 되어 답이 달라졌지만, 역시 3을 곱한 다음 1,000,000,007으로 나눈 나머지는 7이 된다.

www.acmicpc.net

cpp
#include <iostream> #include <numeric> using namespace std; typedef long long ll; const ll Mod = 1000000007; ll Pow(ll X, ll Y) { if (Y == 1) { ‌‌return X; } if (Y % 2 == 1) { ‌‌return X * Pow(X, Y - 1) % Mod; } ‌ll Z = Pow(X, Y / 2); return Z * Z % Mod; } int main() { ‌ios::sync_with_stdio(false); ‌cin.tie(nullptr); cout.tie(nullptr); int M; ‌cin >> M; ‌ll Sum = 0; for (int i = 0; i < M; ++i) { ‌‌int A, B; ‌‌cin >> B >> A; ‌‌ll GCD = gcd(A, B); ‌‌B /= GCD; ‌‌A /= GCD; ‌‌Sum += A * Pow(B, Mod - 2) % Mod; ‌‌Sum %= Mod; } ‌cout << Sum; }

 

문제 설명이 길지만 핵심 내용은 다음과 같습니다.

 

1. 입력 받은 값을 기약 분수로 표현

2. 수식 b^(X - 2) ≡ b-1 (mod X) 에서 큰 수  b^(X - 2) 구하기

 

1번의 경우 numeric stl에 포함된 gcd(최대공약수) 구하는 함수를 이용해서 A와 B를 기약 분수 꼴로 표현 합니다.

2번의 경우 재귀 함수를 이용해서 b의 Mod - 2 제곱을 구해줍니다.