QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#123148#6522. Digit ModelhzawaAC ✓217ms4292kbC++142.6kb2023-07-11 19:50:192023-07-11 19:50:22

Judging History

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

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-07-11 19:50:22]
  • 评测
  • 测评结果:AC
  • 用时:217ms
  • 内存:4292kb
  • [2023-07-11 19:50:19]
  • 提交

answer

// lhzawa(https://www.cnblogs.com/lhzawa/)
// Problem: A. Digit Mode
// Contest: QOJ - The 2019 ICPC China Shaanxi Provincial Programming Contest
// URL: https://qoj.ac/contest/1285/problem/6522
// Memory Limit: 256 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include<bits/stdc++.h>
using namespace std;
const int N = 50 + 5;
const long long mod = 1e9 + 7;
long long fac[N], inv[N];
char s[N];
int c[N];
long long f[12][N][N], g[12][N][N];
int main() {
	fac[0] = inv[0] = 1ll;
	for (int i = 1; i < N; i++) {
		fac[i] = 1ll * fac[i - 1] * i % mod;
	}
	function<long long (long long)> iv = [](long long a) -> long long {
		long long val = 1, b = mod - 2;
		for (; b; b >>= 1, a = a * a % mod) {
			if (b & 1) {
				val = val * a % mod;
			}
		}
		return val;
	};
	inv[N - 1] = iv(fac[N - 1]);
	for (int i = N - 2; i >= 1; i--) {
		inv[i] = 1ll * inv[i + 1] * (i + 1) % mod;
	}
	function<void ()> solve = []() -> void {
		scanf("%s", s);
		int n = strlen(s);
		memset(c, 0, sizeof(c));
		function<long long (int)> _solve = [&n](int m) -> long long {
			memset(f, 0, sizeof(f)), memset(g, 0, sizeof(g));
			f[0][0][0] = 1;
			for (int x = 0; x <= 9; x++){
				for (int i = 0; i <= m; i++) {
					for (int j = 0; j <= n; j++) {
						if (f[x][i][j]) {
							for (int k = 0, zxx = c[x]; i + k <= m; k++, zxx++) {
								long long sval = f[x][i][j] * inv[k] % mod;
								f[x + 1][i + k][max(j, zxx)] = (f[x + 1][i + k][max(j, zxx)] + sval) % mod;
								if (zxx >= j) {
									g[x + 1][i + k][zxx] = (g[x + 1][i + k][zxx] + 1ll * sval * x % mod) % mod;
								}
							}
						}
					}
				}
				for (int i = 0; i <= m; i++) {
					for (int j = 0; j <= n; j++) {
						if (g[x][i][j]) {
							for (int k = 0, zxx = c[x]; i + k <= m && zxx < j; k++, zxx++) {
								g[x + 1][i + k][j] = (g[x + 1][i + k][j] + 1ll * g[x][i][j] * inv[k] % mod) % mod;
							}
						}
					}
				}
			}
			long long val = 0;
			for (int j = 0; j <= n; j++) {
				val = (val + g[10][m][j]) % mod;
			}
			return val * fac[m] % mod;
		};
		long long val = 0;
		for (int i = 1; i < n; i++) {
			for (int j = 1; j <= 9; j++) {
				c[j]++;
				val = (val + _solve(i - 1)) % mod;
				c[j]--;
			}
		}
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < (int)(s[i] - '0'); j++) {
				if (i == 0 && j == 0) {
					continue;
				}
				c[j]++;
				val = (val + _solve(n - i - 1)) % mod;
				c[j]--;
			}
			c[(int)(s[i] - '0')]++;
		}
		val = (val + _solve(0)) % mod;
		printf("%lld\n", val);
	};
	int _;
	scanf("%d", &_);
	for (; _; _--) {
		solve();
	}
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 4ms
memory: 4208kb

input:

5
9
99
999
99999
999999

output:

45
615
6570
597600
5689830

result:

ok 5 number(s): "45 615 6570 597600 5689830"

Test #2:

score: 0
Accepted
time: 5ms
memory: 4196kb

input:

34
7
48
8
76
1
97
7
5
7
7
2
89
9
4
84
46
6
73
86
78
5
3
8
9
31
24
78
7
11
45
2
65
88
6

output:

28
236
36
420
1
597
28
15
28
28
3
525
45
10
484
221
21
399
500
435
15
6
36
45
145
104
435
28
47
215
3
341
516
21

result:

ok 34 numbers

Test #3:

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

input:

16
935
888
429
370
499
881
285
162
178
948
205
858
573
249
773
615

output:

6009
5618
2456
2078
2905
5562
1603
887
993
6121
1174
5378
3333
1374
4724
3631

result:

ok 16 numbers

Test #4:

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

input:

12
1242
9985
6469
9310
4191
9497
3166
3495
9711
9698
4137
2257

output:

7292
63531
37910
58047
23987
59479
18076
19675
61184
61086
23672
12913

result:

ok 12 numbers

Test #5:

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

input:

10
61195
72739
10164
79164
57851
12326
29132
55992
67377
13873

output:

337575
408170
63792
450686
316513
70493
157773
305011
374163
77954

result:

ok 10 numbers

Test #6:

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

input:

8
529983
127270
421121
291729
461233
695056
365028
271160

output:

2744573
687141
2160067
1500426
2359204
3705475
1851172
1381981

result:

ok 8 numbers

Test #7:

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

input:

7
7934351
8474057
1287369
5845624
7796773
5805755
7349121

output:

42465725
45668947
6716401
30094426
41554096
29861098
38756757

result:

ok 7 numbers

Test #8:

score: 0
Accepted
time: 9ms
memory: 4256kb

input:

3
5014252832385738
8762796162648653
919997886706385

output:

892033338
297722019
462512414

result:

ok 3 number(s): "892033338 297722019 462512414"

Test #9:

score: 0
Accepted
time: 24ms
memory: 4252kb

input:

2
775701797726112292362823101
75927988177061355614

output:

371275551
566830847

result:

ok 2 number(s): "371275551 566830847"

Test #10:

score: 0
Accepted
time: 168ms
memory: 4204kb

input:

1
65760982925996012426370962570581226245366145016666

output:

661063035

result:

ok 1 number(s): "661063035"

Test #11:

score: 0
Accepted
time: 168ms
memory: 4212kb

input:

1
62597468169905757754175023836706426691470692832490

output:

9983261

result:

ok 1 number(s): "9983261"

Test #12:

score: 0
Accepted
time: 173ms
memory: 4252kb

input:

1
78912847369504885593964702297317051208901751786824

output:

817123221

result:

ok 1 number(s): "817123221"

Test #13:

score: 0
Accepted
time: 217ms
memory: 4204kb

input:

1
99999999999999999999999999999999999999999999999999

output:

25251932

result:

ok 1 number(s): "25251932"

Test #14:

score: 0
Accepted
time: 146ms
memory: 4136kb

input:

1
999999999999999999999999999999999999999999999

output:

439421821

result:

ok 1 number(s): "439421821"

Test #15:

score: 0
Accepted
time: 92ms
memory: 4292kb

input:

1
9999999999999999999999999999999999999999

output:

387537647

result:

ok 1 number(s): "387537647"

Test #16:

score: 0
Accepted
time: 215ms
memory: 4196kb

input:

1
99999999999999999999999998889999898988888889998888

output:

909431898

result:

ok 1 number(s): "909431898"

Test #17:

score: 0
Accepted
time: 214ms
memory: 4192kb

input:

1
99999999999999999999999998989899988889989889999888

output:

289727470

result:

ok 1 number(s): "289727470"

Test #18:

score: 0
Accepted
time: 213ms
memory: 4208kb

input:

1
99999999999999999999999998998988898888898889898999

output:

962896416

result:

ok 1 number(s): "962896416"

Test #19:

score: 0
Accepted
time: 95ms
memory: 4216kb

input:

1
9999999999999999999989988898888989888899

output:

995903330

result:

ok 1 number(s): "995903330"

Test #20:

score: 0
Accepted
time: 92ms
memory: 4204kb

input:

1
9999999999999999999989999889889998998898

output:

385460258

result:

ok 1 number(s): "385460258"

Test #21:

score: 0
Accepted
time: 214ms
memory: 4216kb

input:

1
99999999999999999999999999999999999999999999999999

output:

25251932

result:

ok 1 number(s): "25251932"