zoukankan      html  css  js  c++  java
  • 【洛谷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
    ",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
    ",ans);
        return 0;
    }
  • 相关阅读:
    计算属性computed和watch侦听器
    .gitignore不起作用
    flex 布局
    vue-awesome-swiper
    Chrome截长屏
    JS 数组 foreach 和 map
    for-in 和 for
    边框画的三角形给shadow
    element-UI 表单图片判空验证问题
    Vue 表格内容根据后台返回状态位填充文字
  • 原文地址:https://www.cnblogs.com/yjkhhh/p/9415981.html
Copyright © 2011-2022 走看看