UOJ Logo

NOI.AC

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#199779#2989. 优美数Anonyme100645ms7156kbC++113.4kb2023-12-21 09:02:342023-12-21 12:01:34

answer

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

#define QwQ330AwA return 0
#define ll __int128

void write(ll x) {
	vector <int> stk;
	while (x) stk.push_back(x % 10), x /= 10;
	reverse(stk.begin(), stk.end());
	for (auto w : stk) cout << w;
}

ll fac[33];
ll pw[33][33];
vector < pair <ll, ll> > pos[33];
ll c[33][33];
ll lim;
int id;

void dfs(int now, int cnt, ll ans, ll sum) {
//	cout << now << ' ' << cnt << ' ';
//	write(ans), cout << ' ';
//	write(sum), cout << '\n';
	if (sum < lim / pw[9][cnt]) return ;
	if (now == 9) {
		pos[id].push_back({sum * pw[9][cnt], ans});
		return ;
	}
	for (int i = 0; i <= cnt; i++) {
		dfs(now + 1, cnt - i, ans * c[cnt][i], sum * pw[now][i]);
	}
}

void init() {
	fac[0] = 1;
	for (int i = 1; i <= 21; i++) fac[i] = fac[i - 1] * i;
	for (int i = 1; i <= 10; i++) {
		pw[i][0] = 1;
		for (int j = 1; j < 33; j++) pw[i][j] = pw[i][j - 1] * i;
	}
	for (int i = 0; i <= 21; i++) {
		c[i][0] = c[i][i] = 1;
		for (int j = 1; j < i; j++) c[i][j] = c[i - 1][j] + c[i - 1][j - 1];
	}
}

int num[33];

signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	init();
	ll Ans = 0;
	for (int i = 1; i <= 21; i++) {
		lim = fac[i];
		for (int j = i + 1; j <= 21; j++) lim = min(lim, (fac[j] - 1) / pw[9][j - i] + 1);
		id = i;
		dfs(1, i, 1, 1);
		sort(pos[i].begin(), pos[i].end());
		//assert(pos[i].begin() -> first >= fac[i]);
//		cout << i << endl;
//		for (auto x : pos[i]) write(x.first), cout << ' ';
//		cout << endl;
		//cout << pos[i].size() << endl;
		reverse(pos[i].begin(), pos[i].end());
		vector < pair <ll, ll> > sp;
		for (int j = 0, k = 0; j < (int)pos[i].size(); j = k) {
			ll sum = 0;
			while (k < (int)pos[i].size() && pos[i][j].first == pos[i][k].first) sum += pos[i][k].second, k++;
			sp.push_back({pos[i][j].first, sum});
		}
		pos[i] = sp;
		for (int j = 1; j < (int)pos[i].size(); j++) pos[i][j].second += pos[i][j - 1].second;
		int l = 0, r = pos[i].size() - 1, ans = -1;
		while (l <= r) {
			int mid = (l + r) / 2;
			if (pos[i][mid].first >= fac[i]) ans = mid, l = mid + 1;
			else r = mid - 1;
		}
		if (ans != -1) Ans += pos[i][ans].second;		
	}
	int t;
	cin >> t;
	while (t--) {
		string s;
		cin >> s;
		if (s.length() > 21) {
			write(Ans);
			cout << '\n';
			continue;
		}
		reverse(s.begin(), s.end());
		for (int i = 0; i < (int)s.length(); i++) num[i] = s[i] - '0';
		int len = s.length();
		ll sum = 0;
		for (int i = 1; i < len; i++) {
			int l = 0, r = pos[i].size() - 1, ans = -1;
			while (l <= r) {
				int mid = (l + r) / 2;
				if (pos[i][mid].first >= fac[i]) ans = mid, l = mid + 1;
				else r = mid - 1;
			}
			if (ans != -1) sum += pos[i][ans].second;
		}
		ll pre = 1;
		for (int i = len - 1; i >= 0; i--) {
			for (int x = 1; x < num[i]; x++) {
				if (i == 0) {
					sum += (pre * x >= fac[len]);
					continue;
				}
				int l = 0, r = pos[i].size() - 1, ans = -1;
				while (l <= r) {
					int mid = (l + r) / 2;
					ll p = pos[i][mid].first;
					p *= x;
					if (p >= fac[len]) {
						ans = mid;
						l = mid + 1;
					} else {
						p *= pre;
						if (p >= fac[len]) ans = mid, l = mid + 1;
						else r = mid - 1;
					}
				}
				if (ans != -1) sum += pos[i][ans].second;
			}
			pre *= num[i];
			if (pre == 0) break;
		}
		if (pre >= fac[len]) sum++;
		write(sum);
		cout << '\n';
	}
	QwQ330AwA;
}

Details

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

Test #1:

score: 10
Accepted
time: 38ms
memory: 7152kb

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: 46ms
memory: 7156kb

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: 105ms
memory: 7152kb

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: 109ms
memory: 7156kb

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: 41ms
memory: 7156kb

input:

3
8212662212468102540154365
19445655726298305109
97190067946627003

output:

2121793450243
2121511412240
1861031606514

result:

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

Test #6:

score: 10
Accepted
time: 38ms
memory: 7156kb

input:

3
6483332648160372
3892040543298291125323
40247259935

output:

1031619953982
2121793450243
2613238047

result:

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

Test #7:

score: 10
Accepted
time: 38ms
memory: 7152kb

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: 42ms
memory: 7156kb

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: 102ms
memory: 7152kb

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: 86ms
memory: 7152kb

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