※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 25917번 문제인 Prime Arrangement이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/25917
먼저, 주어지는 소수들을 임의로 배치했을 때 각 행의 소수들의 곱의 값은 서로 다름을 관찰하자. 주어지는 소수들이 모두 다르므로 소인수분해의 결과가 서로 다를 수밖에 없기 때문이다.
따라서 주어진 소수들로 \(R\)개의 행을 구성했을 때, 이 행들을 주어진 가중치 순서대로 나열하는 방법은 유일하게 정해짐을 관찰할 수 있다.
따라서 이 문제는 주어진 소수들로 \(R\)개의 행을 구성하는 경우의 수(를 998244353으로 나눈 나머지)를 구하는 것으로 해결할 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
using namespace std;
typedef long long ll;
ll inv(ll X) {
ll ret = 1, K = 998244351;
while (K) {
if (K & 1) ret = ret * X % 998244353;
K >>= 1;
X = X * X % 998244353;
}
return ret;
}
ll R, C, RR = 1, RC;
ll ans = 1;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> R >> C;
RC = R * C;
for (ll i = 1; i <= RC; i++) ans = (ans * i) % 998244353;
for (ll i = 1; i <= R; i++) RR = (RR * i) % 998244353;
RR = inv(RR);
ans = ans * RR % 998244353;
cout << ans;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 11391 // C++] 분배 (0) | 2024.05.08 |
---|---|
[BOJ 15553 // C++] 난로 (0) | 2024.05.07 |
[BOJ 18231 // C++] 파괴된 도시 (0) | 2024.05.05 |
[BOJ 12742 // C++] 혼합물 (Small) (0) | 2024.05.04 |
[BOJ 11895 // C++] 속이기 (0) | 2024.05.03 |