【洛谷P2022】有趣的数

有趣的数

题目链接

首先求出1~k中有多少个在k前面的数的个数,若>m,则无解

比如12345,从第一位开始,

1   0~1 共2个  1-0+1

12   10~12共3个    12-10+1

123   100~123 共24个  123-100+1

1234 1000~1234 共235个 1234-1000+1

...

之后看还需要在k前面加多少个数,向下枚举

与上面相似

123450  100000~123450

1234500 1000000~1234500

直到前面的数字>=k,停止枚举,

处理出答案

...

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
#define int long long
int P[20]={1,10,100,1e3,1e4,1e5,1e6,1e7,1e8,1e9,1e10,1e11,1e12,1e13,1e14,1e15,1e16,1e17,1e18,1e19};
int k,m,ans;
#undef int
int main()
#define int long long
{
    scanf("%lld%lld",&k,&m);
    int l=log10(k),div=1,sum=0;
    int ll=l;
    for(int i=1;i<=10;i++)
     if(k==P[i]&&m!=i+1){
        puts("0");
        return 0;
     }
    while(l+1){
        sum+=k/div-P[l]+1;
        div*=10; l--;
    }
    if(m<sum){
        puts("0");
        return 0;
    }
    if(m==sum){
        printf("%lld\n",k);
        return 0;
    }
    m-=sum;
    int u=0;
    while(1){
        u++;
        if(ll+u>18){
            puts("0");
            return 0;
        }
        int d=k*P[u]-P[ll+u];
        if(m>d) m-=d;
        else{
            ans=P[ll+u]+m-1;
            break;
        }
    }
    printf("%lld\n",ans);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/yjkhhh/p/9415981.html