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
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
AC × 4
AC × 24
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