Submission #826722
Source Code Expand
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <stack>
#include <queue>
#include <set>
#include <cmath>
#include <map>
using namespace std;
#define MOD 1000000007
#define ADD(X,Y) ((X) = ((X) + (Y)%MOD) % MOD)
typedef long long i64; typedef vector<int> ivec; typedef vector<string> svec;
i64 modpow(i64 a, i64 p = MOD - 2)
{
if (p == 0) return 1;
i64 tmp = modpow(a, p / 2);
tmp = tmp * tmp % MOD;
if (p % 2) tmp = tmp * a % MOD;
return tmp;
}
int N, K;
i64 fact[4040404], frev[4040404];
i64 invs[4040404];
i64 C(int a, int b)
{
if (a < b) return 0;
return fact[a] * frev[b] % MOD * frev[a - b] % MOD;
}
i64 dp[4020][2020];
i64 solve(int nz, int nk)
{
if (dp[nz][nk] != -1) return dp[nz][nk];
if (nz == N && nk == N) return dp[nz][nk] = 1;
dp[nz][nk] = 0;
if (nz < N) {
ADD(dp[nz][nk], solve(nz + 1, nk));
}
if (nk < N && nk < nz) {
// printf("%d %d, %d %d\n", nz, nk, N * K - nz - nk * (K - 1) - 1, K - 2);
ADD(dp[nz][nk], solve(nz, nk + 1) * C(N * K - nz - nk * (K - 1) - 1, K - 2) % MOD);
}
//printf("%d %d: %lld\n", nz, nk, dp[nz][nk]);
return dp[nz][nk];
}
int main()
{
scanf("%d%d", &N, &K);
if (K == 1) {
puts("1");
return 0;
}
fact[0] = 1; frev[0] = 1;
invs[0] = 1;
invs[1] = 1;
for (int i = 2; i < 4040404; ++i) invs[i] = MOD - MOD / i * invs[MOD % i] % MOD;
for (int i = 1; i < 4040404; ++i) {
fact[i] = fact[i - 1] * i % MOD;
frev[i] = frev[i - 1] * invs[i] % MOD;
}
for (int i = 0; i <= N + K; ++i) {
for (int j = 0; j <= N; ++j) dp[i][j] = -1;
}
i64 sol = solve(0, 0);
sol = sol * fact[N] % MOD;
printf("%lld\n", sol);
return 0;
}
Submission Info
Submission Time
2016-07-31 22:16:49+0900
Task
F - Leftmost Ball
User
semiexp
Language
C++14 (GCC 5.4.1)
Score
1600
Code Size
1778 Byte
Status
AC
Exec Time
580 ms
Memory
158336 KB
Compile Error
./Main.cpp: In function ‘int main()’:
./Main.cpp:59:23: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
scanf("%d%d", &N, &K);
^
Judge Result
Set Name
Sample
All
Score / Max Score
0 / 0
1600 / 1600
Status
Set Name
Test Cases
Sample
0_00.txt, 0_01.txt, 0_02.txt, 0_03.txt
All
0_00.txt, 0_01.txt, 0_02.txt, 0_03.txt, 1_00.txt, 1_01.txt, 1_02.txt, 1_03.txt, 1_04.txt, 1_05.txt, 1_06.txt, 1_07.txt, 1_08.txt, 1_09.txt, 1_10.txt, 1_11.txt, 1_12.txt, 1_13.txt, 1_14.txt, 1_15.txt, 1_16.txt, 1_17.txt, 1_18.txt, 1_19.txt
Case Name
Status
Exec Time
Memory
0_00.txt
AC
292 ms
94976 KB
0_01.txt
AC
4 ms
256 KB
0_02.txt
AC
292 ms
94976 KB
0_03.txt
AC
553 ms
158336 KB
1_00.txt
AC
4 ms
256 KB
1_01.txt
AC
305 ms
102912 KB
1_02.txt
AC
4 ms
256 KB
1_03.txt
AC
580 ms
158336 KB
1_04.txt
AC
562 ms
156160 KB
1_05.txt
AC
577 ms
157056 KB
1_06.txt
AC
573 ms
157696 KB
1_07.txt
AC
519 ms
155776 KB
1_08.txt
AC
557 ms
155904 KB
1_09.txt
AC
564 ms
157056 KB
1_10.txt
AC
533 ms
156032 KB
1_11.txt
AC
565 ms
157696 KB
1_12.txt
AC
334 ms
114304 KB
1_13.txt
AC
484 ms
153216 KB
1_14.txt
AC
283 ms
99712 KB
1_15.txt
AC
358 ms
117248 KB
1_16.txt
AC
382 ms
131072 KB
1_17.txt
AC
490 ms
145152 KB
1_18.txt
AC
302 ms
99584 KB
1_19.txt
AC
578 ms
157824 KB