zoukankan      html  css  js  c++  java
  • URAL 1233

    首先计算出k至少为第几位,如果m小于这个数,那么输出0

    还有一种情况, 就是10的i次方的这种情况,如果i+1等于m,那么直接输出k,否则输出0

    其他的情况,就是二分,然后判断计算其插入到k之前的数的个数与k至少的位数之和

    #include <stdio.h>
    #include <math.h>
    #define LL unsigned long long
    
    LL d[20],k,m,s;
    int t;
    void init()
    {
        d[0]=1;
        for(int i=1;i<20;i++)
            d[i]=d[i-1]*10;
    }
    
    int check(LL x)
    {
        int t=log10(x)+1;
        if(x/d[t-1]==1&&x%d[t-1]==0&&t<m)return 1;
        return 0;
    }
    
    LL pre(LL x)
    {
        LL ans=0;
        for(int i=0;i<t;i++)
        {
            ans+=(x/d[t-1-i]-d[i]+1);
        }
        return ans;
    }
    
    LL f(LL x,LL y)
    {
        LL ans=s;
        int p=log10(y)+1;
        for(int i=t+1;i<=p;i++)
        {
            if(i<p)
                ans+=x*d[i-t]-d[i-1];
            else
            {
                if(x*d[i-t]-d[p-1]>y-d[p-1]){ans+=y-d[p-1];}
                else {ans+=x*d[i-t]-d[p-1];}
            }
        }
        return ans;
    }
    
    int main()
    {
        scanf("%I64u%I64u",&k,&m);
        init();
        t=log10(k)+1;
        s=pre(k);
        if(m<s)
        {
            printf("0
    ");
        }
        else
        {
            if(check(k))printf("0
    ");
            else
            {
                LL l=k,r=1LL<<63,mid=(l+r)/2;
                while(l<r)
                {
                    if(f(k,mid)<m) l=mid+1;
                    else r=mid;
                    mid=(l+r)/2;
                }
                if(mid==k)
                printf("%I64u
    ",mid);
                else
                printf("%I64u
    ",mid-1);
            }
        }
        return 0;
    }
    


  • 相关阅读:
    gdb --configuration
    firecracker 编译
    gvisor 编译
    gvisor
    rust Deref
    rust explicit
    rust move
    rust drop
    出租人对经营租赁的会计处理
    关于以公允价值计量的投资性房地产的处置
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3239048.html
Copyright © 2011-2022 走看看