답안 #19957

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
19957 2016-02-25T07:49:24 Z xdoju 카드 (kriii4_Z) C++14
0 / 100
4 ms 36284 KB
#include <cstdio>
using namespace std;

const int MOD = 1000000007;

int modpow(int r, int n) {
	int ret = 1;
	while (n > 0) {
		if (n % 2 > 0) {
			ret = ((long long)ret * r) % MOD;
		}
		r = ((long long)r * r) % MOD;
		n /= 2;
	}
	return ret;
}

inline int modinv(int n) {
	return modpow(n, MOD - 2);
}

inline int modprod(int a, int b) {
	a = a % MOD;
	b = b % MOD;
	return ((long long)a * b) % MOD;
}

inline int modprod(int a, int b, int c) {
	c = c % MOD;
	return (modprod(a, b) * (long long)c) % MOD;
}

inline int moddiv(int a, int b) {
	return ((long long)a * modinv(b)) % MOD;
}

int n, l, existCnt = 0;
int d[3001];
int fact[3001];
int c[3001][3001];

void proc() {
	scanf("%d %d", &n, &l);
	for (int i = 1; i <= n; ++i) {
		scanf("%d", &d[i]);
		existCnt += (d[i] > 0) ? 1 : 0;
	}

	c[1][0] = c[1][1] = 1;
	for (int i = 2; i <= n; ++i) {
		c[i][0] = c[i][i] = 1;
		for (int j = 1; j < i; ++j) {
			c[i][j] = (c[i - 1][j - 1] + c[i - 1][j]) % MOD;
		}
	}
	fact[0] = fact[1] = 1;
	for (int i = 2; i <= n; ++i) {
		fact[i] = modprod(fact[i - 1], i);
	}

	int ans = 0;
	for (int k = existCnt; k <= n; ++k) {
		if (k > l) {
			break;
		}

		int u = moddiv(1, modpow(n, k));
		int v = modprod(u, fact[k]);

		int w = moddiv(modpow(k, l - k), modpow(n, l - k));

		int x = modprod(v, w, c[n][k]);

		ans = (ans + x) % MOD;
	}
	printf("%d", ans);
}

int main() {
	//freopen("input.txt", "r", stdin);
	proc();
	return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 4 ms 36284 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Halted 0 ms 0 KB -