1. 程式人生 > >JiLi Number (打表)

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;
}