오늘의 알고리즘

[C++] 백준 13172 Σ

하늘하늘 . 2022. 10. 29. 16:07
#include <iostream>
 
long long power(long long lUnder, long long lUp)
{
    long long lAns = 1;
 
    while (lUp) 
    {
        if (lUp % 2 == 1)
        {
            lAns = lAns * lUnder % 1000000007;
        }
 
        lUp /= 2;
        lUnder = lUnder * lUnder % 1000000007;
    }
 
    return lAns;
}
 
int main()
{
    int N = 0;
    std::cin >> N;
    long long answer = 0;
 
    for (int i = 0; i < N; ++i)
    {
        int Ni = 0;
        int Si = 0;
        std::cin >> Si >> Ni;
 
        answer += (Ni * (power(Si, 1000000007 - 2))) % 1000000007;
    }
 
    std::cout << answer % 1000000007;
 
    return 0;
}
 

문제가 진짜 정말 너무 길었습니다. 서론이 너무 길어서 본론을 찾기가 어려웠는데...

본론은 딱 

 

소수 모듈러에서만 성립하는 페르마의 소정리에 의해 b의X - 1승 ≡ 1 (mod X)가 성립하기에,
b의X - 2승 ≡ b의 -1승 (mod X) 역시 성립함을 알 수 있다.

이 문장이었습니다. a * b의 -1승의 값을 구하기 위해서 X값이 1,000,000,007이기 때문에  b의-1승 = b의X -2승 값인

b의1,000,000,007 - 2승를 구하라는 말이었는데 N의 100승은 N의2승의 50승과 같은 말이기 때문에 계속해서 반으로 나누는 분할제곱을 이용해서 풀었습니다.