思路:总共到100000000000有 83个数,所以打表列出很方便。(一开始用大数做了好久,超时)
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long LL;
LL ch[120];
char str[120];
int main(void)
{
ch[1]=1;
ch[2]=199981;
ch[3]=199982;
ch[4]=199983;
ch[5]=199984;
ch[6]=199985;
ch[7]=199986;
ch[8]=199987;
ch[9]=199988;
ch[10]=199989;
ch[11]=199990;
ch[12]=200000;
ch[13]=200001;
ch[14]=1599981;
ch[15]=1599982;
ch[16]=1599983;
ch[17]=1599984;
ch[18]=1599985;
ch[19]=1599986;
ch[20]=1599987;
ch[21]=1599988;
ch[22]=1599989;
ch[23]=1599990;
ch[24]=2600000;
ch[25]=2600001;
ch[26]=13199998;
ch[27]=35000000;
ch[28]=35000001;
ch[29]=35199981;
ch[30]=35199982;
ch[31]=35199983;
ch[32]=35199984;
ch[33]=35199985;
ch[34]=35199986;
ch[35]=35199987;
ch[36]=35199988;
ch[37]=35199989;
ch[38]=35199990;
ch[39]=35200000;
ch[40]=35200001;
ch[41]=117463825;
ch[42]=500000000;
ch[43]=500000001;
ch[44]=500199981;
ch[45]=500199982;
ch[46]=500199983;
ch[47]=500199984;
ch[48]=500199985;
ch[49]=500199986;
ch[50]=500199987;
ch[51]=500199988;
ch[52]=500199989;
ch[53]=500199990;
ch[54]=500200000;
ch[55]=500200001;
ch[56]=501599981;
ch[57]=501599982;
ch[58]=501599983;
ch[59]=501599984;
ch[60]=501599985;
ch[61]=501599986;
ch[62]=501599987;
ch[63]=501599988;
ch[64]=501599989;
ch[65]=501599990;
ch[66]=502600000;
ch[67]=502600001;
ch[68]=513199998;
ch[69]=535000000;
ch[70]=535000001;
ch[71]=535199981;
ch[72]=535199982;
ch[73]=535199983;
ch[74]=535199984;
ch[75]=535199985;
ch[76]=535199986;
ch[77]=535199987;
ch[78]=535199988;
ch[79]=535199989;
ch[80]=535199990;
ch[81]=535200000;
ch[82]=535200001;
ch[83]=1111111110;
while(~scanf("%s",str))
{
LL l=1,r=83,ans=-1,len=strlen(str),sum=0,i;
if(len>10)
{
printf("83 1111111110\n");continue;
}
for(i=0;i<len;i++) sum=sum*10+str[i]-'0';
while(l<=r)
{
int mid=(l+r)>>1;
if(sum<ch[mid]) r=mid-1;
else l=mid+1,ans=mid;
}
printf("%lld %lld\n",ans,ch[ans]);
}
return 0;
}
参考文章:https://blog.csdn.net/qq_34531807/article/details/78069062