PS
BOJ 31738 : 매우 어려운 문제
lickelon
2025. 1. 7. 22:52
- 문제 링크 : http://boj.kr/31738
- 난이도 : S5
- 태그 : 정수론
코드
#include <bits/stdc++.h>
#define all(x) (x).begin(), (x).end()
#define INF 0x7FFFFFFF
using namespace std;
using ll = long long;
using ld = long double;
using pii = pair<int,int>;
using pll = pair<ll, ll>;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
ll n, m;
cin >> n >> m;
ll ans = 1;
for(ll i = 1; i <= min(n, m); i++) {
ans *= (i % m);
ans %= m;
}
cout << ans;
return 0;
}
풀이
n > m인 경우 n!은 항상 m의 배수이다.
따라서 n과 m 중 더 작은 값까지 직접 곱해보면 답을 구할 수 있다.
곱할 때 나머지의 성질 (a*b) mod c = (a mod c * b mod c) mod c임을 이용한다.
728x90