Đề bài:
Thuật toán:
- (đang cập nhập)
Code:
#include
using namespace std;
int factorial(int n, long long MOD) {
int ret = 1;
for(int i = 1; i <= n; i++) ret = ((long long)(ret) * i) % MOD;
return ret;
}
int power(int x, int k, long long MOD) {
if (k == 0) return 1;
long long t = power(x, k / 2, MOD);
t = (t * t) % MOD;
if (k % 2 == 1) t = (t * x) % MOD;
return t;
}
int count_in_grid(int m, int n, int s) {
return max(0, min(max(0, s - 1), m) - max(max(0, s - n), 1) + 1);
}
int calc(int m, int n, long long MOD) {
int x = 1;
for(int i = 1; i < m + m; i++) {
int j = m + m + 1 - i;
int k = count_in_grid(m - n, m - n, j) + 2 * count_in_grid(n, m - n, j - m);
x = ((long long)(x) * power(i, k, MOD)) % MOD;
}
int ret = ((long long)(factorial((long long)(m) * m - (long long)(n) * n, MOD)) * power(x, MOD - 2, MOD)) % MOD;
return ret;
}
int main()
{
//freopen("L.inp","r",stdin);
//freopen("L.out","w",stdout);
int m, n ;
long long MOD;
cin >> m >> n >> MOD;
cout << calc(m, n, MOD);
}
Recent Comments