문제/백준
c++ 백준_13172_"Σ"
나 진짜 못차마
2023. 6. 9. 22:19
728x90
13172번: Σ
모듈러가 11에서 1,000,000,007이 되어 답이 달라졌지만, 역시 3을 곱한 다음 1,000,000,007으로 나눈 나머지는 7이 된다.
www.acmicpc.net
*
정확한 풀이는 아닙니다.
우연히 맞춰서 얼떨떨하네
문제 양, 내용 미쳤다
풀기 껄끄러웠는데
CLASS 4 다 해보고싶어서
억지로 잡고 읽어봤다.

진짜 문제만 40분 가까이 읽은 거 같다.
그래도 많은 문제에서 나온
1000000007
의 기원에 대해 조금은 알은 듯하다.
아주 조금
그래도 이해가 안돼서
대충 하나하나 엮어가봤다.
1.

일단 S/N 모양의 더하기 집합 형태라는 것
2.

a/b 이면,
a x b^-1modX 형태로 가능하다는 것
3.

b^(X-2) = b^-1(modX)
(여기서 모듈러 합동이라는 기호지만 편하게 =으로 표시)
그래서 입력으로
N, S 가 입력으로 주어지니까
3 7 이 주어졌다 가정하면
S/N = 7/3
7/3 = 7 * 3^-1(modX)
여기서 3^-1(modX) = 3^(X-2) 형태로 바뀐다.
그럼 최종적으로
7 * 3^(X-2)를 계산하면된다.
여기서 X 는 1,000,000,007 을 넣으면 된다.
그럼
3^(1000000005)를 구해야하는데
복잡하니 분할정복을 이용한 거듭제곱으로 시간복잡도를 낮춰 진행했다.
**
검색해보니 합동 연산자랑 =기호랑 의미가 다른데
그냥 =로 생각해 일단 계산했는데 왜 돌아간지 신기하다.
#include <iostream>
using namespace std;
typedef unsigned long long type;
#define MOD 1000000007
type myPow(type x, type n) {
type result = 1;
while (n) {
if (n & 1)
result = (result * x)%MOD;
x = (x * x)%MOD;
n >>= 1;
}
return result;
}
int main(void) {
int M;
cin >> M;
type ans = 0;
int N, S;
for (int i = 0; i < M; i++) {
cin >> N >> S;
ans += (S * myPow(N, MOD - 2))%MOD;
}
cout << ans % MOD;
}

728x90