QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#573539#2519. Number with BachelorsSapnapTTAC ✓191ms111668kbC++142.8kb2024-09-18 19:10:192024-09-18 19:10:25

Judging History

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

  • [2024-09-18 19:10:25]
  • 评测
  • 测评结果:AC
  • 用时:191ms
  • 内存:111668kb
  • [2024-09-18 19:10:19]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
const int N=(1<<16)+10,M=105;
int T;
int type;
int cnt,a[M];
unsigned long long dp[M][N][2];
unsigned long long dfs(int pos,bool limit,int now){
    if(!pos){
    	return 1;
	}
    if(!limit&&dp[pos][now][(type==10)?0:1]!=-1){
    	return dp[pos][now][(type==10)?0:1];
	}
    int up=limit?a[pos]:type-1;
	unsigned long long res=0;
    for(int i=0;i<=up;i++){
        if((now>>i)&1){
        	continue;
		}
        if(now==0&&i==0){
        	res+=dfs(pos-1,limit&&i==up,now);
		}
        else{
        	res+=dfs(pos-1,limit&&i==up,now|(1<<i));
		}
    }
    if(!limit){
    	dp[pos][now][(type==10)?0:1]=res;
	}
    return res;
}
unsigned long long solve(unsigned long long x){
    cnt=0;
    while(x){
        a[++cnt]=x%type;
        x/=type;
    }
    return dfs(cnt,1,0);
}
unsigned long long read(){
    unsigned long long x=0;
    char s[22];
    scanf("%s",s+1);
    int len=strlen(s+1);
    for(int i=1;i<=len;i++) {
        if(s[i]<='9'&&s[i]>='0'){
        	x=x*type+s[i]-'0';
		}
        else{
        	x=x*type+s[i]-'a'+10;
		}
    }
    return x;
}
void print(unsigned long long x){
    if(x==0){
        printf("0\n");
        return ;
    }
    if(type==10){
    	printf("%llu\n", x);
	}
    else{
        vector<int> ans;
        while(x){
            int p=x%type;
            x/=type;
            ans.push_back(p);
        }
        for(int i=ans.size()-1;i>=0;i--) {
            if(ans[i]>=10){
            	printf("%c",ans[i]-10+'a');
			}
            else{
            	printf("%c",ans[i]+'0');
			}
        }
        printf("\n");
    }
}
signed main(){
    memset(dp,-1,sizeof dp);
    scanf("%d",&T);
    while(T--){
        char op[10];
        scanf("%s",op);
        if(op[0]=='d'){
        	type=10;
		}
        else{
        	type=16;
		}
        int flag;
        scanf("%d",&flag);
        if(!flag){
            unsigned long long a=read(),b=read();
            unsigned long long ans=solve(b);
            if(a>0){
            	ans-=solve(a-1);
			}
            print(ans);
        }
        else{
            unsigned long long x=read();
            if(x<10){
                printf("%llu\n",x-1);
                continue;
            }
            unsigned long long l=0,r=0,ans=0;
			r--;
            if(solve(r)<x){
                printf("-\n");
                continue;
            }
            while(l<=r){
                unsigned long long mid=(l+r)>>1;
                if(solve(mid)>=x){
                	ans=mid;
                	r=mid-1;
				}
				else{
					l=mid+1;
				}
            }
            print(ans);
        }
    }
}
/*
6
d 0 10 20
h 0 10 1f
d 1 10
h 1 f
d 1 1000000000
h 1 fffffffffffffff
*/

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 52ms
memory: 111316kb

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: 191ms
memory: 111668kb

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