luogu 2022 有趣的数

 我的代码能力被虐爆了,惨不忍睹。

学到了数字字典序的方法,

大于原数且字典序比他小的一定是他的原数减一在后面添9(10^n除外)

eg: 比233大且字典序比他小的是 1000~2329 10000~23299 .....

个数就是1330 13300 133000....每次做差比较即可,

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
LL mypow[20];
int main()
{
    mypow[0] = 1;
    for( LL i = 1;i <= 20;i++ ){
        mypow[i] = mypow[i-1]*10;
    }
    LL n,m;
    scanf("%lld%lld",&n,&m);
    if(n==1&&m!=1)cout<<0<<endl;
   else if(n==10&&m!=2)cout<<0<<endl;
   else if(n==100&&m!=3)cout<<0<<endl;
   else if(n==1000&&m!=4)cout<<0<<endl;
   else if(n==10000&&m!=5)cout<<0<<endl;
   else if(n==100000&&m!=6)cout<<0<<endl;
   else if(n==1000000&&m!=7)cout<<0<<endl;
   else if(n==10000000&&m!=8)cout<<0<<endl;
   else if(n==100000000&&m!=9)cout<<0<<endl;
   else if(n==1000000000&&m!=10)cout<<0<<endl;
   else{
    m--;
    LL wei = 17;
    while( n / mypow[wei] == 0 ) wei--; wei++;
    LL base = (n - mypow[wei-1])*10;
    LL re = 0;
    for( LL i = wei-1;i >= 0;i-- ){
        LL x = n /  mypow[i];
        re += x- mypow[ wei-i-1 ]+1;

    }
    re--;
    m -=re;
    if( m < 0 ){
        printf("0\n");
        return 0;
    }
    if( m == 0 ){
        printf("%lld",n);
        return 0;
    }
    while( m - base  > 0 ){
        m -= base;
        base *= 10;
        wei++;
    }
    LL ans = mypow[ wei ] + m-1;
    printf("%lld",ans);
   }
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值