K - JiLi Number (打表)

思路:总共到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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值