QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#333369#7754. Rolling For DaysYansuan_HClAC ✓275ms164252kbC++144.7kb2024-02-19 21:02:432024-02-19 21:02:43

Judging History

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

  • [2024-02-19 21:02:43]
  • 评测
  • 测评结果:AC
  • 用时:275ms
  • 内存:164252kb
  • [2024-02-19 21:02:43]
  • 提交

answer

#include <bits/stdc++.h>
#define ms(x, v) memset(x, v, sizeof(x))
#define il __attribute__((always_inline)) static
#define U(i,l,r) for(int i(l),END##i(r);i<=END##i;++i)
#define D(i,r,l) for(int i(r),END##i(l);i>=END##i;--i)
using namespace std;
using ll = long long;

#define IC isdigit(c)
#define GC c=getchar()
void rd(auto &x) { x = 0; char GC; bool f = 0;
	for (; !IC; GC) f |= c == '-';
	for (; IC; GC) x = x * 10 + c - 48;
	if (f) x = -x;
}
void rd(auto &x, auto &...y) { rd(x); rd(y...); }
#define meow(...) fprintf(stderr, __VA_ARGS__)
#define Assert(e) if (!(e)) { meow("AF@%d\n", __LINE__); exit(__LINE__); }

const int N = 1005, M = 12, SX = 1 << M;
const ll P = 998244353;
void I(ll &x, ll v) { (x += v) %= P; }
ll fac[N], ifac[N], inv[N], har[N], sNum[N];
ll qpow(ll x, ll t = P - 2) { ll v = 1; for (; t; (x *= x) %= P, t >>= 1) if (t & 1) (v *= x) %= P; return v; }
void gFac() {
	fac[0] = ifac[0] = 1;
	U (i, 1, N - 1) fac[i] = fac[i - 1] * i % P;
	ifac[N - 1] = qpow(fac[N - 1]);
	D (i, N - 2, 1) ifac[i] = ifac[i + 1] * (i + 1) % P;
	U (i, 1, N - 1)
		inv[i] = ifac[i] * fac[i - 1] % P,
		har[i] = (har[i - 1] + inv[i]) % P,
		sNum[i] = (sNum[i - 1] + i) % P;
	// inv[0] = -P / 114;
	// inv[0] = 1;
	// inv[0] = 0;
}
ll C(int n, int m) {
	if (m > n || m < 0) return 0;
	return fac[n] * ifac[n - m] % P * ifac[m] % P;
}
// ll sInv(int l, int r) { return (har[r] - har[l - 1] + P) % P; }
ll sum(int l, int r) { return (sNum[r] - sNum[l - 1] + P) % P; }
ll desPw(int n, int m) {
	if (m > n) return 0;
	return fac[n] * ifac[n - m] % P;
}
ll iDesPw(int n, int m) {
	if (m > n) return 0;
	return ifac[n] * fac[n - m] % P;
}

int n, m, a[M], b[M], S;
int sumA[SX], sumB[SX];
ll f[SX][N], g[SX][N], sum1[SX][N] {}, sum2[SX][N] {}, sum3[SX][N] {};

void genSum(int s) {
	U (j, 0, n) {
		if (j)
			sum1[s][j] = sum1[s][j - 1],
			sum2[s][j] = sum2[s][j - 1],
			sum3[s][j] = sum3[s][j - 1];
		int delta = sumA[s] - sumB[s];
		if (n - j - delta < 0) continue;
		I(sum1[s][j], ifac[n - j - delta] * g[s][j]);
		I(sum2[s][j], ifac[n - j - delta] * f[s][j]);
		I(sum2[s][j], ifac[n - j - delta]
			* delta % P
			* har[n - j - delta] % P
			* g[s][j]);
		I(sum3[s][j], ifac[n - j - delta] * g[s][j] % P * delta % P);
	}
}

int main() {

	rd(n, m);
	int inital = 0;
	U (i, 0, m - 1) rd(a[i]);
	U (i, 0, m - 1) {
		rd(b[i]);
		if (b[i] == 0) inital |= 1 << i;
	}
	gFac();

	S = (1 << m) - 1;
	U (s, 1, S) {
		int i = __lg(s & -s), t = s ^ (1 << i);
		sumA[s] = sumA[t] + a[i];
		sumB[s] = sumB[t] + b[i];
	}

	g[inital][0] = 1;
	
	U (s, inital + 1, S) {
		genSum(s - 1);
		
		if ((s & inital) != inital) continue;
		U (i, 1, n) U (x, 0, m - 1) if ((s >> x) & 1) {
			if (!b[x]) continue;
			int t = s ^ (1 << x), delta = sumA[t] - sumB[t];
			if (b[x] - 1 > i - 1 - sumB[t]) continue;
			if (n - i + 1 - (sumA[t] - sumB[t]) <= 0) continue; 

			ll g0 = g[s][i], f0 = f[s][i];
			ll z = C(i - 1 - sumB[t], b[x] - 1)
				* fac[n - i - delta] % P
				* fac[a[x]] % P * ifac[a[x] - b[x]] % P;
			ll bSum1 = 0, bSum2 = 0;
			// if (s == 3 && i == 3 && x == 1)
			// 	meow("gg\n");
			// U (j, 0, i - 1) { // to be prefix optimized
			// 	ll p = 1;
			// 	// p = C(i - 1 - sumB[t], b[x] - 1);
			// 	// if (!p) continue;
				
			// 	(p *= ifac[n - j - delta]) %= P;
			// 	// (p *= fac[n - i + 1 - 1 - (sumA[t] - sumB[t])]) %= P;
			// 	// (p *= fac[a[x]] * ifac[a[x] - b[x]] % P) %= P;
			// 	ll len = delta * (har[n - j - delta] - har[n - i - delta] + P) % P;
			// 	I(g[s][i], g[t][j] * p % P * z % P);
			// 	I(f[s][i], (f[t][j] + g[t][j] * len) % P * p % P * z % P);
			// 	I(bSum1, f[t][j] * p % P + g[t][j] * har[n - j - delta] % P * p % P * delta % P);
			// 	I(bSum2, g[t][j] * delta % P * p % P);
			// 	ll ass = f[t][j] * p % P + g[t][j] * har[n - j - delta] % P * p % P * delta % P;
			// 	ass -= g[t][j] * delta % P * p % P * har[n - i - delta] % P - P;
			// 	ass %= P;
			// 	if (ass * z % P != (f[t][j] + g[t][j] * len) % P * p % P * z % P)
			// 		meow("?\n");
			// }
			// ll tg = g[s][i], tf = f[s][i];
			// if (tf)
			// 	meow("meow\n");
			ll p = z;
			g[s][i] = g0; f[s][i] = f0;

			// Assert(sum2[t][i - 1] == bSum1);
			// Assert(sum3[t][i - 1] == bSum2);
			// if ((bSum1 - bSum2 * har[n - i - delta] % P + P) % P * p % P != (tf - f[s][i] + P) % P)
			// 	meow("pity\n");
			// if ((g[s][i] + p * sum1[t][i - 1]) % P != tg)
			// 	meow("fuck\n");
			I(g[s][i], p * sum1[t][i - 1]);
			I(f[s][i], (sum2[t][i - 1] - sum3[t][i - 1] * har[n - i - delta] % P + P) % P * p);
			
			// g[s][i] = tg; f[s][i] = tf;
		}
	}

	clog << g[S][sumB[S]] << endl;
	cout << (f[S][sumB[S]] + sumB[S]) % P << endl; // f 只记了抽出不合法的期望步数
}

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

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 5808kb

input:

2 2
1 1
1 1

output:

2

result:

ok answer is '2'

Test #2:

score: 0
Accepted
time: 0ms
memory: 5748kb

input:

4 2
2 2
2 1

output:

582309210

result:

ok answer is '582309210'

Test #3:

score: 0
Accepted
time: 1ms
memory: 5776kb

input:

5 5
1 1 1 1 1
0 0 0 0 1

output:

5

result:

ok answer is '5'

Test #4:

score: 0
Accepted
time: 0ms
memory: 7888kb

input:

4 4
1 1 1 1
1 1 1 0

output:

831870299

result:

ok answer is '831870299'

Test #5:

score: 0
Accepted
time: 0ms
memory: 5748kb

input:

5 2
4 1
2 1

output:

598946616

result:

ok answer is '598946616'

Test #6:

score: 0
Accepted
time: 0ms
memory: 5816kb

input:

5 2
3 2
3 1

output:

482484776

result:

ok answer is '482484776'

Test #7:

score: 0
Accepted
time: 0ms
memory: 5824kb

input:

5 5
1 1 1 1 1
0 1 1 1 0

output:

665496242

result:

ok answer is '665496242'

Test #8:

score: 0
Accepted
time: 1ms
memory: 5732kb

input:

3 3
1 1 1
1 1 0

output:

499122180

result:

ok answer is '499122180'

Test #9:

score: 0
Accepted
time: 0ms
memory: 6104kb

input:

5 5
1 1 1 1 1
1 0 1 1 1

output:

582309212

result:

ok answer is '582309212'

Test #10:

score: 0
Accepted
time: 1ms
memory: 5784kb

input:

3 2
2 1
2 0

output:

499122180

result:

ok answer is '499122180'

Test #11:

score: 0
Accepted
time: 1ms
memory: 6064kb

input:

20 5
1 6 7 2 4
0 1 3 1 4

output:

75028873

result:

ok answer is '75028873'

Test #12:

score: 0
Accepted
time: 1ms
memory: 6288kb

input:

15 5
4 2 3 4 2
2 1 1 2 1

output:

585494868

result:

ok answer is '585494868'

Test #13:

score: 0
Accepted
time: 1ms
memory: 5964kb

input:

20 4
5 4 3 8
1 2 2 3

output:

156108321

result:

ok answer is '156108321'

Test #14:

score: 0
Accepted
time: 1ms
memory: 5720kb

input:

15 2
6 9
2 8

output:

672033760

result:

ok answer is '672033760'

Test #15:

score: 0
Accepted
time: 8ms
memory: 48680kb

input:

20 12
1 2 1 1 2 4 1 3 2 1 1 1
1 0 0 1 0 0 1 0 2 0 1 1

output:

691640771

result:

ok answer is '691640771'

Test #16:

score: 0
Accepted
time: 0ms
memory: 30368kb

input:

19 12
1 1 1 2 1 2 2 1 2 4 1 1
1 1 0 1 1 0 1 1 0 2 1 0

output:

777326448

result:

ok answer is '777326448'

Test #17:

score: 0
Accepted
time: 1ms
memory: 5728kb

input:

20 2
19 1
1 1

output:

299473325

result:

ok answer is '299473325'

Test #18:

score: 0
Accepted
time: 1ms
memory: 5676kb

input:

19 2
14 5
10 1

output:

497380388

result:

ok answer is '497380388'

Test #19:

score: 0
Accepted
time: 1ms
memory: 6120kb

input:

100 5
10 25 6 19 40
0 2 4 5 11

output:

773338801

result:

ok answer is '773338801'

Test #20:

score: 0
Accepted
time: 1ms
memory: 5960kb

input:

64 5
1 12 13 33 5
1 0 1 20 0

output:

571823997

result:

ok answer is '571823997'

Test #21:

score: 0
Accepted
time: 1ms
memory: 5904kb

input:

100 4
15 38 24 23
0 20 0 1

output:

635309463

result:

ok answer is '635309463'

Test #22:

score: 0
Accepted
time: 0ms
memory: 6200kb

input:

88 5
15 25 9 19 20
8 15 9 18 17

output:

400310961

result:

ok answer is '400310961'

Test #23:

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

input:

100 12
2 2 13 9 13 7 2 1 6 15 17 13
0 0 5 7 10 7 0 1 0 0 4 4

output:

552732942

result:

ok answer is '552732942'

Test #24:

score: 0
Accepted
time: 12ms
memory: 64612kb

input:

59 12
7 6 3 5 4 6 5 2 5 6 5 5
4 5 2 5 3 6 0 2 1 0 3 3

output:

27023521

result:

ok answer is '27023521'

Test #25:

score: 0
Accepted
time: 0ms
memory: 5812kb

input:

100 3
10 60 30
0 28 21

output:

261595276

result:

ok answer is '261595276'

Test #26:

score: 0
Accepted
time: 0ms
memory: 5748kb

input:

84 2
39 45
4 23

output:

897695217

result:

ok answer is '897695217'

Test #27:

score: 0
Accepted
time: 2ms
memory: 6608kb

input:

1000 5
370 136 129 182 183
312 47 112 22 119

output:

705415872

result:

ok answer is '705415872'

Test #28:

score: 0
Accepted
time: 0ms
memory: 6164kb

input:

766 5
372 194 98 90 12
165 123 53 27 0

output:

870555094

result:

ok answer is '870555094'

Test #29:

score: 0
Accepted
time: 1ms
memory: 5876kb

input:

1000 2
374 626
175 591

output:

501708945

result:

ok answer is '501708945'

Test #30:

score: 0
Accepted
time: 1ms
memory: 5796kb

input:

701 1
701
413

output:

413

result:

ok answer is '413'

Test #31:

score: 0
Accepted
time: 267ms
memory: 163012kb

input:

1000 12
101 43 34 281 23 24 12 25 66 222 145 24
37 43 27 257 5 11 12 19 62 41 87 13

output:

265294941

result:

ok answer is '265294941'

Test #32:

score: 0
Accepted
time: 79ms
memory: 117140kb

input:

942 12
83 142 96 10 3 10 60 93 398 13 11 23
37 56 36 0 3 0 10 35 33 1 9 19

output:

956409637

result:

ok answer is '956409637'

Test #33:

score: 0
Accepted
time: 0ms
memory: 6264kb

input:

1000 4
473 65 438 24
79 61 327 24

output:

491224221

result:

ok answer is '491224221'

Test #34:

score: 0
Accepted
time: 0ms
memory: 6080kb

input:

870 4
320 17 182 351
145 0 181 4

output:

664946681

result:

ok answer is '664946681'

Test #35:

score: 0
Accepted
time: 135ms
memory: 134272kb

input:

1000 12
102 2 110 62 106 176 37 27 6 208 92 72
57 0 106 20 36 4 20 12 3 134 8 61

output:

3888811

result:

ok answer is '3888811'

Test #36:

score: 0
Accepted
time: 140ms
memory: 135888kb

input:

1000 12
1 44 209 187 27 71 127 139 134 22 20 19
0 19 153 113 27 29 82 74 37 19 20 9

output:

278584590

result:

ok answer is '278584590'

Test #37:

score: 0
Accepted
time: 275ms
memory: 164252kb

input:

1000 12
193 84 261 36 75 7 70 12 38 22 8 194
68 15 11 20 16 7 53 1 6 6 6 189

output:

704313398

result:

ok answer is '704313398'

Test #38:

score: 0
Accepted
time: 124ms
memory: 123020kb

input:

1000 12
171 135 21 74 115 3 4 122 32 70 224 29
71 120 20 66 61 2 1 102 28 0 201 3

output:

608268027

result:

ok answer is '608268027'

Test #39:

score: 0
Accepted
time: 272ms
memory: 162504kb

input:

1000 12
54 20 201 182 16 66 23 153 36 39 151 59
33 5 189 80 13 56 13 38 7 22 92 21

output:

795531860

result:

ok answer is '795531860'

Test #40:

score: 0
Accepted
time: 271ms
memory: 163536kb

input:

1000 12
218 16 12 152 67 64 65 3 90 263 44 6
107 2 2 143 11 28 53 2 55 106 39 5

output:

903827471

result:

ok answer is '903827471'

Extra Test:

score: 0
Extra Test Passed