UOJ Logo

NOI.AC

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#200490#27. BAnonyme100430ms24072kbC++112.1kb2024-01-04 09:03:292024-01-04 12:05:57

answer

#include <bits/stdc++.h>
using namespace std;

#define QwQ330AwA return 0
#define ll long long

const int mod = 1e9 + 7;
const int N = 3035;
int n, k, q;
ll f[N], g[N], a[N], b[N];
ll inv[N];
ll ksm(ll a, int b) {
	ll ans = 1;
	for (; b; b >>= 1, a = a * a % mod) {
		if (b & 1) ans = ans * a % mod;
	}
	return ans;
}
ll s[N][N];
ll fac[N];

signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin >> n >> k >> q;
	if (n <= 3005) {
		ll ans = 0;
		fac[0] = 1;
		for (int i = 1; i <= n; i++) fac[i] = fac[i - 1] * i % mod;
		inv[n] = ksm(fac[n], mod - 2);
		for (int i = n; i >= 1; i--) inv[i - 1] = inv[i] * i % mod;
		ll now = 0;
		for (int i = 1; i <= n; i++) {
			now = (now + ksm(i, k)) % mod;
			ans = (ans + now * ksm(q, i) % mod * fac[n] % mod * inv[i] % mod * inv[n - i] % mod) % mod;
		}
		cout << ans;
		return 0;
	}
	f[0] = 1;
	for (int i = 1; i <= k + 2; i++) inv[i] = ksm(mod - i, mod - 2);
	for (int i = 1; i <= k + 2; i++) {
		for (int j = k + 2; j >= 0; j--) {
			f[j + 1] = (f[j + 1] + f[j]) % mod;
			f[j] = f[j] * (mod - i) % mod;
		}
	}
	ll xs = 0;
	for (int i = 1; i <= k + 2; i++) {
		g[0] = f[0];
		for (int j = 0; j <= k + 1; j++) {
			g[j] = g[j] * inv[i] % mod;
			g[j + 1] = (f[j + 1] - g[j] + mod) % mod;
		}
		xs += ksm(i, k);
		xs %= mod;
		ll iv = 1;
		for (int j = 1; j <= k + 2; j++) {
			if (i == j) continue;
			iv = iv * (i - j) % mod;
			iv = (iv + mod) % mod;
		}
		iv = ksm(iv, mod - 2) % mod;
		for (int j = 0; j <= k + 1; j++) {
			a[j] = (a[j] + g[j] * xs % mod * iv % mod) % mod;
		}
	}
	s[0][0] = 1;
	for (int i = 1; i <= k + 1; i++) {
		for (int j = 0; j <= i; j++) {
			s[i][j] = s[i - 1][j] * j % mod;
			if (j) s[i][j] = (s[i][j] + s[i - 1][j - 1]) % mod;
		}
	}
	for (int i = 0; i <= k + 1; i++) {
		for (int j = i; j <= k + 1; j++) {
			b[i] = (b[i] + a[j] * s[j][i] % mod) % mod;
		}
	}
	ll ans = 0;
	ll down = 1;
	for (int i = 0; i <= min(n, k + 1); i++) {
		ans = ans + down * b[i] % mod * ksm(q, i) % mod * ksm(q + 1, n - i) % mod;
		ans %= mod;
		down = down * (n - i) % mod;
	}
	cout << ans;
	QwQ330AwA;
}

Details

小提示:点击横条可展开更详细的信息

Test #1:

score: 10
Accepted
time: 1ms
memory: 1256kb

input:

2 2968 248085442

output:

53931179

result:

ok 1 number(s): "53931179"

Test #2:

score: 10
Accepted
time: 0ms
memory: 1256kb

input:

1 1262 725874701

output:

725874701

result:

ok 1 number(s): "725874701"

Test #3:

score: 10
Accepted
time: 0ms
memory: 1260kb

input:

6 1899 847871770

output:

120581092

result:

ok 1 number(s): "120581092"

Test #4:

score: 10
Accepted
time: 79ms
memory: 15420kb

input:

548444 1452 262477339

output:

500837612

result:

ok 1 number(s): "500837612"

Test #5:

score: 10
Accepted
time: 35ms
memory: 9300kb

input:

849214 1004 553545924

output:

700237000

result:

ok 1 number(s): "700237000"

Test #6:

score: 10
Accepted
time: 0ms
memory: 1280kb

input:

857801894 0 660567989

output:

78674556

result:

ok 1 number(s): "78674556"

Test #7:

score: 10
Accepted
time: 142ms
memory: 24072kb

input:

845054185 1951 194160742

output:

350980457

result:

ok 1 number(s): "350980457"

Test #8:

score: 10
Accepted
time: 23ms
memory: 7948kb

input:

404918682 886 379769093

output:

746456151

result:

ok 1 number(s): "746456151"

Test #9:

score: 10
Accepted
time: 94ms
memory: 17364kb

input:

7290700 1575 457614788

output:

251875400

result:

ok 1 number(s): "251875400"

Test #10:

score: 10
Accepted
time: 56ms
memory: 12396kb

input:

854360230 1245 204915831

output:

107791581

result:

ok 1 number(s): "107791581"

Extra Test:

score: 0
Extra Test Passed