UOJ Logo

NOI.AC

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#199794#2989. 优美数tkswls1005766ms19100kbC++112.9kb2023-12-21 11:01:472023-12-21 12:03:30

answer

#include <bits/stdc++.h>
#pragma GCC optimize(2)
#define ll __int128
#define int __int128
using namespace std;
ll n, ans, p, b[1000006], ccnt, c[1000006], t, a[30], jie[30], m, sum, op;
map<ll, ll> ma;
vector<pair<ll, ll>> v[30];
string s;
inline ll read() {
	ll x = 0, t = 1;
	char ch = getchar();
	while (ch < '0' || ch > '9') {
		if (ch == '-')
			t = -1;
		ch = getchar();
	}
	while (ch >= '0' && ch <= '9') {
		x = (x << 1) + (x << 3) + (ch ^ 48);
		ch = getchar();
	}
	return x * t;
}
inline void write(ll x) {
	if (x < 0) {
		putchar('-');
		x = -x;
	}
	if (x > 9)
		write(x / 10);
	putchar(x % 10 + '0');
}
signed main() {
	jie[0] = 1;
	for (int i = 1; i <= 21; i++) {
		jie[i] = jie[i - 1] * i;
	}
	p = 1;
	for (int i = 1; i <= 9; i++) {
		v[1].push_back(make_pair(i, 1));
	}
	for (int i = 1; i <= 20; i++) {
		ma.clear();
		for (int j = 1; j <= ccnt; j++) b[j] = 0;
		ccnt = 0;
		for (int j = 0; j < v[i].size(); j++) {
			for (int k = 0; k <= 9; k++) {
				if (!ma[v[i][j].first * k]) ma[v[i][j].first * k] = ++ccnt, c[ccnt] = v[i][j].first * k;
				b[ma[v[i][j].first * k]] += v[i][j].second;
			}
		}
		for (int j = 1; j <= ccnt; j++) {
			v[i + 1].push_back(make_pair(c[j], b[j]));
		}
		sort(v[i + 1].begin(), v[i + 1].end());
	}
	for (int i = 1; i <= 21; i++) {
		for (int j = v[i].size() - 2; j >= 0; j--) {
			v[i][j].second += v[i][j + 1].second;
//			if (i == 4) {
//				write(v[i][j].first);
//				cout << ' ';
//				write(v[i][j].second);
//				cout << "||";
//			}
		}
//		cout << '\n';
	}
	t = read();
	v[0].push_back(make_pair(1, 1));
//	cout << "|";
//	write(t);
//	cout << "|";
	while (t--) {
		sum = 1;
		cin >> s;
		if (s.size() > 21) {
			for (int i = 1; i <= 21; i++) {
				a[i] = 9;
				sum *= 9;
			}
			m = 21;
		} else {
			for (int i = s.size(); i >= 1; i--) {
				a[i] = s[s.size() - i] - '0';
//				write(a[i]);
				sum *= s[s.size() - i] - '0';
			}
			m = s.size();
		}
		ans = 0;
		for (int i = 1; i < m; i++) {
			ans += v[i][lower_bound(v[i].begin(), v[i].end(), make_pair(jie[i], (ll) - 1)) - v[i].begin()].second;
		}
		ll cnt = 1;
		for (int i = m; i >= 1; i--) {
//			write(a[i]);
//			cout << ' ';
			for (int j = 1; j < a[i]; j++) {
//				write(v[i - 1][lower_bound(v[i - 1].begin(), v[i - 1].end(), make_pair((jie[m] - 1) / (cnt * j) + 1, (ll) - 1)) - v[i - 1].begin()].second);
//				cout << "|";
//				write(lower_bound(v[i - 1].begin(), v[i - 1].end(), make_pair((jie[m] - 1) / (cnt * j) + 1, (ll) - 1)) - v[i - 1].begin());
//				cout << "**";
//				write((jie[m] - 1) / (cnt * j) + 1);
//				cout << "%%";
				op = lower_bound(v[i - 1].begin(), v[i - 1].end(), make_pair((jie[m] - 1) / (cnt * j) + 1, (ll) - 1)) - v[i - 1].begin();
				if (op < v[i - 1].size()) {
					ans += v[i - 1][op].second;
				}

			}
			cnt *= a[i];
			if (!cnt) break;
		}
		if (sum >= jie[m]) ans++;
		write(ans);
		cout << "\n";
	}

}

详细

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

Test #1:

score: 10
Accepted
time: 477ms
memory: 19096kb

input:

10000
47837
518455
655112
954345
600612
439802
420101
521472
537870
564701
532021
80484
18346
373734...

output:

28521
255105
331170
498198
305480
214091
203166
256272
266189
282501
262266
49149
10929
181859
39705...

result:

ok 10000 numbers

Test #2:

score: 10
Accepted
time: 698ms
memory: 19096kb

input:

10000
4058707
38032
2504347
7593417
4041877
8727030
1346770
7742834
7692976
554753
2279696
5140166
2...

output:

1576280
22467
940084
3142681
1576280
3683468
565983
3220642
3197318
276248
852824
2010866
931280
344...

result:

ok 10000 numbers

Test #3:

score: 10
Accepted
time: 642ms
memory: 19092kb

input:

10000
980475503196470826
409488057248738093
964119271402833647
578964283299264159
142509873610207494...

output:

2071241664423
1970523647942
2056479141675
1974294607826
1969798331582
1603540352679
1971880091330
19...

result:

ok 10000 numbers

Test #4:

score: 10
Accepted
time: 532ms
memory: 19096kb

input:

10000
810356108140771788
300489122283682456
762404595750439923
480865512993981847
550163957708337313...

output:

2015446574701
1969871629532
1993921074841
1971184218783
1973110540433
2052181582591
1987832109612
19...

result:

ok 10000 numbers

Test #5:

score: 10
Accepted
time: 472ms
memory: 19096kb

input:

3
8212662212468102540154365
19445655726298305109
97190067946627003

output:

2121793450243
2121511412240
1861031606514

result:

ok 3 number(s): "2121793450243 2121511412240 1861031606514"

Test #6:

score: 10
Accepted
time: 565ms
memory: 19096kb

input:

3
6483332648160372
3892040543298291125323
40247259935

output:

1031619953982
2121793450243
2613238047

result:

ok 3 number(s): "1031619953982 2121793450243 2613238047"

Test #7:

score: 10
Accepted
time: 733ms
memory: 19096kb

input:

200
282198
9455423614089
560151079866656
8058866664071192
18431809
622570433460150897110199
53873023...

output:

136630
122292625535
484191134993
1216741215387
5645680
2121793450243
58672426490
336568368
212179345...

result:

ok 200 numbers

Test #8:

score: 10
Accepted
time: 509ms
memory: 19096kb

input:

200
248212546060755377765
2951478667201
5087
9147186474579
918
7
65639
931533331045710461
8192108437...

output:

2121793167295
41565106450
3505
119237514903
729
7
39570
2052221635237
682457002854
6279
212169718855...

result:

ok 200 numbers

Test #9:

score: 10
Accepted
time: 524ms
memory: 19100kb

input:

10000
6112878206338759544
30104707437906067469
99979487336233526005
55863650164083552054
87604483409...

output:

2107155938386
2121511412241
2121744195978
2121511594073
2121552264516
2121511420735
2121511412240
21...

result:

ok 10000 numbers

Test #10:

score: 10
Accepted
time: 614ms
memory: 19092kb

input:

10000
64229512433483029478
3662181692760349362
12485423318924806225
34778296778156581266
31579270837...

output:

2121513598993
2106700807499
2121511412240
2121511412241
2106700763074
2121627144876
2106712293588
21...

result:

ok 10000 numbers

Extra Test:

score: 0
Extra Test Passed