QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#574067#2519. Number with BachelorslifanAC ✓315ms54776kbC++141.8kb2024-09-18 20:42:192024-09-18 20:42:20

Judging History

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

  • [2024-09-18 20:42:20]
  • 评测
  • 测评结果:AC
  • 用时:315ms
  • 内存:54776kb
  • [2024-09-18 20:42:19]
  • 提交

answer

// 
//½øÖÆת»»ºÃÌâ°¡ 
#include<bits/stdc++.h>
typedef unsigned long long ll;
using namespace std;
int a[25], B, cnt;
ll f[2][2][25][1 << 16], l, r;
ll dfs(int pos, int tmp, bool limit, bool flg) {
	if(pos == -1) return 1;
	if(!limit && f[flg][B == 10][pos][tmp] != 18446744073709551615ull) return f[flg][B == 10][pos][tmp];
	ll up = limit ? a[pos] : B - 1, res = 0;
	for(int i = 0; i <= up; i++) if(!(flg | (i > 0)) || !(tmp & (1 << i))) res += dfs(pos - 1, (flg | (i > 0)) ? (tmp | (1 << i)) : tmp, limit & (i == up), flg | (i > 0));
	if(!limit) f[flg][B == 10][pos][tmp] = res;
	return res;
}
ll init(ll x) {
	if(x == 18446744073709551615ull) return 0;
	cnt = 0;
	while(x) a[cnt++] = x % B, x /= B; 
	return dfs(cnt - 1, 0, 1, 0);
} 
ll read() {
	ll qpow = 1, sum = 0;
	string s;
	cin>>s;
	for(int i = s.length() - 1; ~i; i--) {
		int p = (('0' <= s[i] && s[i] <= '9') ? s[i] - '0' : (s[i] - 'a' + 10));
		sum += p * qpow;
		qpow *= B;  
	}
	return sum;
}
void print(ll x) {
	if(x == 0) return cout<<0<<'\n', void();
	cnt = 0; while(x) a[cnt++] = x % B, x /= B;
	for(int i = cnt - 1; ~i; i--) {
		if(a[i] <= 9) cout<<a[i];
		else cout<<char(a[i] - 10 + 'a');
	}
	cout<<'\n';
}
void solve() {
	char opt;
	cin>>opt; 
	if(opt == 'd') B = 10; else B = 16;
	cin>>opt;
	if(opt == '0') {
		l = read(), r = read();
		print(init(r) - ((l > 0) ? init(l - 1) : 0));
	} else if(opt == '1') {
		l = read();
		if(l == 1) return cout<<"0\n", void();
		ll L = 0, R = 9223372036854775807ll, mid, ans = -1;
		while(L <= R) {
			mid = L + R >> 1;	
			if(init(mid) >= l) ans = mid, R = mid - 1;
			else L = mid + 1;
		}
		if(ans == -1) cout<<'-'<<'\n';
		else print(ans);
	}
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	memset(f, -1, sizeof f);
	int t; cin>>t;
	while(t--) solve();
	return 0;
}

详细

Test #1:

score: 100
Accepted
time: 40ms
memory: 54772kb

input:

6
d 0 10 20
h 0 10 1f
d 1 10
h 1 f
d 1 1000000000
h 1 ffffffffffffffff

output:

10
f
9
e
-
-

result:

ok 6 lines

Test #2:

score: 0
Accepted
time: 315ms
memory: 54776kb

input:

50000
h 1 147a
d 0 25 71
d 1 3587
d 0 26922 51887
d 1 711
d 0 3 5
h 0 7bf2defab442a0b1 f299a4cf1d4d9bed
d 0 6961 91018
d 1 4
d 1 876
h 1 12cc5d3370f99120
d 1 161315
h 0 25f 6959
d 0 467 516
d 1 298
h 1 70260cdc2da73281
h 1 928e17d65d764ca2
h 1 c8ec8a7b67605e51
d 1 91697
d 0 4941925161850941148 89850...

output:

1b36
43
6587
7710
953
3
8daab378500
26054
3
1356
-
946307
4681
40
387
-
-
-
491850
0
1
29
-
4605298
1
1
-
15b4
175f
9b944134000
124b7
6279
9
6257
-
39be22a900
5c636b59300
146ce
2a55
-
0
-
7
d
6
2041
-
1c94afe7300
0
5
9149
16540973
1389
125
0
-
3bc31189480
424
66800
7
-
-
1e6
0
0
48b6
9
-
2b0
5019
14...

result:

ok 50000 lines