본문 바로가기
백준 알고리즘/백준 CLASS 4

[백준 C++] 13172번 : Σ

by code_killer 2022. 12. 8.
728x90
반응형

1. 문제

 

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

 

13172번: Σ

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

www.acmicpc.net

2. 알고리즘 분류

  • 수학
  • 정수론
  • 분할 정복을 이용한 거듭제곱
  • 모듈로 곱셈 역원
  • 페르마의 소정리

 

3. 소스 코드

#include <iostream>
#define MOD 1000000007
using namespace std;

// n^m을 구하는 함수
// 분할 정복을 이용한 거듭제곱
long long power(long long n, long long m) {
	long long ret = 1;
	while (m) {
		if (m & 1) ret = ret * n % MOD;
		m = m / 2;
		n = n * n % MOD;
	}
	return ret;
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	// 입력
	int M;
	long long ans = 0;
	cin >> M;

	for (int i = 0; i < M; i++) {
		long long N, S;
		cin >> N >> S;

		// S/N = S * N^(1,000,000,007 - 2) mod 1,000,000,007
		ans += (S * (power(N, MOD - 2))) % MOD;
	}

	cout << ans % MOD;

	return 0;
}

 

4.  유용한 문법 및 알고리즘

5 - 1)  분할 정복을 이용한 거듭제곱

long long power(long long n, long long m) {
	long long ret = 1;
	while (m) {
		if (m & 1) ret = ret * n % MOD;
		m = m / 2;
		n = n * n % MOD;
	}
	return ret;
}

 

728x90