P2022 有趣的数
题目描述
让我们来考虑111到NNN的正整数集合。让我们把集合中的元素按照字典序排列,例如当N=11N=11N=11时,其顺序应该为:1,10,11,2,3,4,5,6,7,8,91,10,11,2,3,4,5,6,7,8,91,10,11,2,3,4,5,6,7,8,9。
定义KKK在NNN个数中的位置为Q(N,K)Q(N,K)Q(N,K),例如Q(11,2)=4Q(11,2)=4Q(11,2)=4。现在给出整数KKK和MMM,要求找到最小的NNN,使得Q(N,K)=MQ(N,K)=MQ(N,K)=M。
输入格式
输入文件只有一行,是两个整数KKK和MMM。
输出格式
输出文件只有一行,是最小的NNN,如果不存在这样的NNN就输出000。
输入输出样例 #1
输入 #1
2 4输出 #1
11输入输出样例 #2
输入 #2
100000001 1000000000输出 #2
100000000888888879说明/提示
【数据约定】
40%40\%40%的数据,1≤K,M≤1051 \le K,M \le 10^51≤K,M≤105;
100%100\%100%的数据,1≤K,M≤1091 \le K,M \le 10^91≤K,M≤109。
C++实现
#include<cmath>#include<cstdio>usingnamespacestd;intlen;longlongk,m,num,p[20];intmain(){scanf("%lld%lld",&k,&m);p[0]=1;for(inti=1;i<=18;++i)p[i]=p[i-1]*10;for(inti=0;i<=18;++i)if(k==p[i]){if(m==i+1)printf("%lld\n",k);elseprintf("0\n");return0;}len=(int)log10(k);for(inti=len;i>=0;--i)num+=k/p[i]-p[len-i]+1;if(num==m)printf("%lld\n",k);elseif(num>m)printf("0\n");else{for(inti=1;i<=10;++i){k*=10;num+=k-p[len+i];if(num>=m){num-=k-p[len+i];printf("%lld\n",m-num+p[len+i]-1);return0;}}}return0;}后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容