-
백준 - Σ (13172) [C++]문제 풀이/백준 2024. 4. 8. 23:35반응형
이 문제는 분할 정복을 이용해서 푸는 문제이다.
문제가 아주 어려운 얘기로 가득한데, 결론적으로 S1/N1 + S2/N2 + ... + SM/NM 을 구해야 하고, 여기서 곱셈 역원을 계산할 때 b^(x - 2) (mod X) 를 사용하라는 얘기이다.
따라서 이 문제는 분할 정복을 사용하여 거듭제곱을 풀 수 있으면 된다.
값이 매우 크기 때문에 모듈러 연산을 곳곳에 배치해두었다.
중요한 점은 마지막 answer에도 모듈러 연산을 해줘야 정답이 나온다는 것이다.
#include <iostream> #include <utility> #include <vector> #include <queue> #include <algorithm> using namespace std; #define MOD 1000000007 typedef long long LL; LL calculate(LL a, LL x) { if (x == 0) { return 1; } if (x % 2 == 1) { return calculate(a, x - 1) % MOD * a % MOD; } else { LL result = calculate(a, x / 2) % MOD; return result % MOD * result % MOD; } } int M; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); LL answer = 0; cin >> M; for (int i = 0; i < M; i++) { LL N, S; cin >> N >> S; LL result = S * calculate(N, MOD - 2) % MOD; answer += result; answer %= MOD; } cout << answer << '\n'; return 0; }
반응형'문제 풀이 > 백준' 카테고리의 다른 글
백준 - 별 찍기 - 11 (2448) [C++] (0) 2024.04.09 백준 - 가장 긴 바이토닉 부분 수열 (11054) [C++] (0) 2024.04.08 백준 - 서강그라운드 (14938) [C++] (0) 2024.04.08 백준 - 구슬 탈출 2 (13460) [C++] (0) 2024.04.08 백준 - 파이프 옮기기 1 (17070) [C++] (0) 2024.04.08