문제 풀이/백준

백준 - Σ (13172) [C++]

JJJaewon 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;
}
반응형