728x90
풀이
지문이 어마무시하게 길면서 Fermat’s little theorem에 대해 설명이 친절한 문제이다. 요점은 다음과 같다.
- M개의 N과 S에 대해 S*N^(MOD-2)의 합들을 MOD로 나눈 나머지를 구하면 된다.
단, N^(MOD-2)를 구하는 과정에서 수가 너무 커지므로 중간과정마다 MOD로 나누어줘야 한다.
소스코드
#include <stdio.h>
const int MOD = 1e9+7;
int main(){
long long sum = 0, N;
int M, S;
scanf("%d", &M);
while (M--){
scanf("%d %d", &N, &S);
long long temp = 1, k = MOD-2;
while (k){
if (k & 1) temp = temp*N %MOD;
k >>= 1;
N = N*N %MOD;
}
sum = (sum + S*temp) %MOD;
}
printf("%lld", sum);
}
출처 및 참고자료
13172번: Σ
모듈러가 11에서 1,000,000,007이 되어 답이 달라졌지만, 역시 3을 곱한 다음 1,000,000,007으로 나눈 나머지는 7이 된다.
www.acmicpc.net
페르마의 소정리 - 위키백과, 우리 모두의 백과사전
수론에서, 페르마의 소정리(Fermat小定理, 영어: Fermat’s little theorem)는 어떤 수가 소수일 간단한 필요 조건에 대한 정리이다. 추상적으로, 소수 크기의 유한체 위의 프로베니우스 사상이 항등 함
ko.wikipedia.org
728x90
'PS > Baekjoon Online Judge' 카테고리의 다른 글
[백준 11444] 피보나치 수 6 [C] (0) | 2021.08.21 |
---|---|
[백준 10830] 행렬 제곱 [C] (0) | 2021.08.21 |
[백준 16953] A → B [C/C++] (0) | 2021.08.20 |
[백준 5639] 이진 검색 트리 [C] (0) | 2021.08.19 |
[백준 2879] 코딩은 예쁘게 [C] (0) | 2021.08.19 |