PS/Baekjoon Online Judge
[백준 13172] Σ [C]
kimyoungrok
2021. 8. 20. 21:43
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