알고리즘/알고리즘 이론, 템플릿

모듈러 역원와 페르마의 소정리

b1ackhand 2023. 9. 12. 22:25

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

 

13172번: Σ

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

www.acmicpc.net

모듈러 역원에 대해서 잘 설명해 놓은 문제이다.

 

핵심은 7/3 과 같은 분수를 답으로  하는 문제들을 판별하기 위해 a × b ^(-1) mod X 형태로 만드는것이다.

여기서 b^-1 이 모듈러 곱셈의 역원이다.

 

ll dq(ll a, ll b) 
{
	if (b == 1) 
		return a;

	if (b % 2 == 1) 
		return a * dq(a, b - 1) % MOD;

	ll c = dq(a, b / 2);

	return c * c % MOD;
}

for (int i = 0; i < N; i++)
{
	cin >> b >> a;

	ll mok = gcd(a, b);
	b /= mok;
	a /= mok;
	ans += a * dq(b, MOD - 2) % MOD;
	ans %= MOD;
}

 

 

문제 나와있지만 중요한것은 페르마의 소정리이다. 소수 에서만 성립하는 정리이기때문에 이와 gcd를 활용하면 모듈러 곱셈의 역원을 구해 나눗셈을 알 수 있다.

 

'알고리즘 > 알고리즘 이론, 템플릿' 카테고리의 다른 글

다익스트라  (0) 2023.10.26
포함배제원리와 뫼비우스함수  (0) 2023.09.20
레이지세그  (0) 2023.08.21
코포 템플릿  (0) 2023.08.07
분할 정복을 이용한 거듭제곱  (0) 2023.07.17