打卡信奥刷题(2530)用C++实现信奥 P2022 有趣的数
2026/6/26 1:51:53 网站建设 项目流程

P2022 有趣的数

题目描述

让我们来考虑111NNN的正整数集合。让我们把集合中的元素按照字典序排列,例如当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

定义KKKNNN个数中的位置为Q(N,K)Q(N,K)Q(N,K),例如Q(11,2)=4Q(11,2)=4Q(11,2)=4。现在给出整数KKKMMM,要求找到最小的NNN,使得Q(N,K)=MQ(N,K)=MQ(N,K)=M

输入格式

输入文件只有一行,是两个整数KKKMMM

输出格式

输出文件只有一行,是最小的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^51K,M105

100%100\%100%的数据,1≤K,M≤1091 \le K,M \le 10^91K,M109

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考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询