有趣的数,洛谷之提高历练地,神奇的解法

正题

      有趣的数有趣的你

      这一题一点也不有趣,跟我们班的可爱的同学们解释了半天,我们来理解理解。

      我们来找一下规律,当n是几位的时候,它带来的贡献(在k前面的数)是多少。


没错,很容易发现绿色的部分是当n的位数小于k的位数时,带来的贡献是,k的前n位-10的n-1次方加一。

否则就直接是(k-10^(k-1))*(10^(n-k)),那么我们就可以算出来n是几位数,按理推出n是多少即可(因为在相同位,在k前面的一定是连续的。)

#include<cstdio>
#include<cstdlib>
#include<cstring>

long long k,m;
char s[20];

int got(int x)
{
    int tot=0;
    while(x>0)
    {
        x/=10;
        tot++;
    }
    return tot;
}

int main()
{
    scanf("%s %lld",s,&m);
    sscanf(s,"%d",&k);
    if(k==m && strlen(s)==1) 
	{
		printf("1");
   		return 0;
    }
	int now=1;
    long long tot=0;
    long long begin=1,end=s[0]-'0';
    m--;long long mm=m;
    while(now<20)
    {
        long long nowb=begin,nowe=end;
        if(now>=strlen(s))
            nowe--;
        long long t=nowe-nowb+1;
        tot+=t;
        //printf("%lld %lld %lld %lld\n",nowb,nowe,t,mm);
        if(tot>=m)
        {
            printf("%lld\n",nowb-1+mm);
            return 0;
        }
        begin*=10;
        if(now>=strlen(s))
            end*=10;
        else
            end=end*10+s[now]-'0';
        mm-=t;
        now++;
    }
    printf("0");
}


猜你喜欢

转载自blog.csdn.net/deep_kevin/article/details/80017812
今日推荐