QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#323265#8211. Enumerating SubstringskarunaAC ✓159ms7680kbC++202.5kb2024-02-09 03:11:022024-02-09 03:11:02

Judging History

你现在查看的是最新测评结果

  • [2024-02-09 03:11:02]
  • 评测
  • 测评结果:AC
  • 用时:159ms
  • 内存:7680kb
  • [2024-02-09 03:11:02]
  • 提交

answer

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

typedef long long ll;
const int MOD = 1e9 + 7;
struct mint {
	int x;
	mint() : x(0) {}
	mint(int x) : x(x) {}
	mint operator+(int ot) const { return x + ot >= MOD ? x + ot - MOD : x + ot; }
	mint operator-(int ot) const { return x < ot ? x - ot + MOD : x - ot; }
	mint operator*(int ot) const { return 1ll * x * ot % MOD; }
	mint operator+=(int ot) { return *this = *this + ot; }
	mint operator-=(int ot) { return *this = *this - ot; }
	mint operator*=(int ot) { return *this = *this * ot; }
	operator int() { return x; }
};
mint mpow(mint a, ll x) {
	mint r = 1;
	while (x) {
		if (x & 1) r *= a;
		a *= a;
		x /= 2;
	}
	return r;
}

mint binom(int n, int k) {
	mint r = 1;
	for (int i = 1; i <= k; i++) r *= i;
	r = mpow(r, MOD - 2);
	for (int i = n; i > n - k; i--) r *= i;
	return r;
}

mint pw[1010101];
int main() {
	mint n, m, k;
	cin >> n.x >> m.x >> k.x;
	pw[0] = 1;
	for (int i = 1; i < 1010101; i++) pw[i] = pw[i - 1] * k;

	mint ans = 0;
	mint acc = 0;
	for (int l = (m.x + 1) / 2; l <= m.x; l++) {
		if (k.x < m.x - l) continue;

		mint cnt = binom(k, m - l);
		for (int i = 1; i <= m - l; i++) cnt *= i;

		mint tot = 0;

		int z = (2 * l - m) / 2;
		if (z < l - k.x) {
			continue;
		}
		mint s = binom(k - m + l, z) * binom(k - m + l - z, 2 * l - m - 2 * z) * mpow(2, MOD - 1 - z);
		for (int i = 1; i <= 2 * l - m; i++) s *= i;

		for (int x = z; x >= 0; x--) {
			if (x < l - k.x) continue;
			tot += s;
			if (x != 0) {
				s *= x;
				s *= mpow(2 * l - m - 2 * x + 1, MOD - 2);
				s *= mpow(2 * l - m - 2 * x + 2, MOD - 2);
				s *= (k - l + x);
				s *= 2;
			}
		}
		cnt *= tot;

		if (l != m.x) {
			acc += cnt;
		}
		else {
			cnt -= acc;
		}

		mint cur = 0;
		for (int r = 1; r <= (n.x - m.x + l) / l; r++) {
			int sz = r * l + (m.x - l);
			int rp = (l == m.x) ? r : (r + 1) / 2;

			int sx = 0;
			int ex = min(n.x - sz, l - 1);

			int sy = max(0, n.x - sz - l + 1);
			int ey = n.x - sz;

			if (ex < sy) {
				cur += pw[n.x - sz - l] * (ex - sx + 1 + ey - sy + 1) * (pw[l] - 1) * rp;
				cur += pw[n.x - sz - 2 * l] * (pw[l] - 1) * (pw[l] - 1) * (sy - ex - 1) * rp;
			}
			else {
				cur += pw[n.x - sz - l] * (pw[l] - 1) * (sy - sx + ey - ex) * rp;
				cur += pw[n.x - sz] * (ex - sy + 1) * rp;
			}
			//cout << sz << ' ' << "[" << sx << ", " << ex << "] " << "[" << sy << ", " << ey << "]\n";
		}
		//cout << l << ' ' << cnt << ' ';
		//cout << cur << endl;
		ans += cur * cnt;
	}
	cout << ans << '\n';
}

这程序好像有点Bug,我给组数据试试?

详细

Test #1:

score: 100
Accepted
time: 6ms
memory: 7680kb

input:

4 2 3

output:

228

result:

ok 1 number(s): "228"

Test #2:

score: 0
Accepted
time: 159ms
memory: 7604kb

input:

999999 1999 12345678

output:

52352722

result:

ok 1 number(s): "52352722"

Test #3:

score: 0
Accepted
time: 7ms
memory: 7680kb

input:

7 4 2

output:

182

result:

ok 1 number(s): "182"

Test #4:

score: 0
Accepted
time: 3ms
memory: 7592kb

input:

4 3 4

output:

480

result:

ok 1 number(s): "480"

Test #5:

score: 0
Accepted
time: 3ms
memory: 7596kb

input:

3 1 1

output:

3

result:

ok 1 number(s): "3"

Test #6:

score: 0
Accepted
time: 6ms
memory: 7572kb

input:

5 5 1

output:

0

result:

ok 1 number(s): "0"

Test #7:

score: 0
Accepted
time: 6ms
memory: 7604kb

input:

7 4 3

output:

5784

result:

ok 1 number(s): "5784"

Test #8:

score: 0
Accepted
time: 3ms
memory: 7652kb

input:

5 2 4

output:

3932

result:

ok 1 number(s): "3932"

Test #9:

score: 0
Accepted
time: 6ms
memory: 7604kb

input:

8 2 2

output:

1522

result:

ok 1 number(s): "1522"

Test #10:

score: 0
Accepted
time: 6ms
memory: 7660kb

input:

8 1 2

output:

2048

result:

ok 1 number(s): "2048"

Test #11:

score: 0
Accepted
time: 3ms
memory: 7532kb

input:

7 5 3

output:

2430

result:

ok 1 number(s): "2430"

Test #12:

score: 0
Accepted
time: 7ms
memory: 7540kb

input:

10 4 3

output:

272004

result:

ok 1 number(s): "272004"

Test #13:

score: 0
Accepted
time: 3ms
memory: 7656kb

input:

675978 614 2

output:

0

result:

ok 1 number(s): "0"

Test #14:

score: 0
Accepted
time: 6ms
memory: 7596kb

input:

244613 38 1

output:

0

result:

ok 1 number(s): "0"

Test #15:

score: 0
Accepted
time: 6ms
memory: 7532kb

input:

186293 1462 1

output:

0

result:

ok 1 number(s): "0"

Test #16:

score: 0
Accepted
time: 3ms
memory: 7680kb

input:

24867 886 1

output:

0

result:

ok 1 number(s): "0"

Test #17:

score: 0
Accepted
time: 6ms
memory: 7592kb

input:

976164 1014 2

output:

0

result:

ok 1 number(s): "0"

Test #18:

score: 0
Accepted
time: 6ms
memory: 7600kb

input:

179356 2 716844809

output:

577866092

result:

ok 1 number(s): "577866092"

Test #19:

score: 0
Accepted
time: 14ms
memory: 7672kb

input:

621001 130 310625363

output:

892869197

result:

ok 1 number(s): "892869197"

Test #20:

score: 0
Accepted
time: 37ms
memory: 7548kb

input:

678862 850 754662812

output:

582264789

result:

ok 1 number(s): "582264789"

Test #21:

score: 0
Accepted
time: 46ms
memory: 7656kb

input:

650845 978 348443366

output:

825425732

result:

ok 1 number(s): "825425732"

Test #22:

score: 0
Accepted
time: 16ms
memory: 7536kb

input:

669914 402 87448112

output:

318098088

result:

ok 1 number(s): "318098088"

Test #23:

score: 0
Accepted
time: 26ms
memory: 7600kb

input:

998593 530 681228665

output:

408255654

result:

ok 1 number(s): "408255654"

Test #24:

score: 0
Accepted
time: 138ms
memory: 7604kb

input:

369361 1954 125266115

output:

509912384

result:

ok 1 number(s): "509912384"

Test #25:

score: 0
Accepted
time: 85ms
memory: 7672kb

input:

900226 1378 424079373

output:

406320917

result:

ok 1 number(s): "406320917"

Test #26:

score: 0
Accepted
time: 86ms
memory: 7548kb

input:

334887 1506 17859926

output:

503264679

result:

ok 1 number(s): "503264679"

Test #27:

score: 0
Accepted
time: 30ms
memory: 7592kb

input:

936048 544 53978328

output:

548647866

result:

ok 1 number(s): "548647866"

Test #28:

score: 0
Accepted
time: 60ms
memory: 7668kb

input:

152789 1264 792983073

output:

839541707

result:

ok 1 number(s): "839541707"

Test #29:

score: 0
Accepted
time: 83ms
memory: 7660kb

input:

714493 1392 91796331

output:

721071046

result:

ok 1 number(s): "721071046"

Test #30:

score: 0
Accepted
time: 32ms
memory: 7540kb

input:

269571 816 830801077

output:

330064211

result:

ok 1 number(s): "330064211"

Test #31:

score: 0
Accepted
time: 50ms
memory: 7608kb

input:

845120 944 424581630

output:

348960190

result:

ok 1 number(s): "348960190"

Test #32:

score: 0
Accepted
time: 14ms
memory: 7596kb

input:

533990 368 163586376

output:

522092095

result:

ok 1 number(s): "522092095"

Test #33:

score: 0
Accepted
time: 113ms
memory: 7592kb

input:

181707 1792 462399634

output:

373795106

result:

ok 1 number(s): "373795106"

Test #34:

score: 0
Accepted
time: 134ms
memory: 7660kb

input:

417349 1920 761212891

output:

587051329

result:

ok 1 number(s): "587051329"

Test #35:

score: 0
Accepted
time: 71ms
memory: 7628kb

input:

526583 1344 500217637

output:

108767800

result:

ok 1 number(s): "108767800"

Test #36:

score: 0
Accepted
time: 36ms
memory: 7596kb

input:

867054 769 93998191

output:

239123369

result:

ok 1 number(s): "239123369"

Extra Test:

score: 0
Extra Test Passed