2002-2003 ACM-ICPC Northeastern European Regional Contest (NEERC 02) A Amusing Numbers (数学)

其实挺简单的。先直接算出之前已经排在k这个数前面的数字。比如543是三位的,那么100~543都是可以的,两位的10~54。

如果还需要往前面补的话,那么依次考虑1000~5430,5430是上界不能选,10000~54300。

有一种情况样例4是10000~10000,,这样是不会增加的应该输出'0'。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

int dig[89],sz;

void dec(ll k)
{
    sz = 0;
    while(k){
        dig[sz++] = k%10;
        k /= 10;
    }
    reverse(dig,dig+sz);
}


int main()
{
    freopen("amusing.in","r",stdin);
    freopen("amusing.out","w",stdout);
    ll K,M; cin>>K>>M;
    ll a = 0;
    dec(K);
    for(int i = sz; i > 0; i--){
        ll data = 0,low = 1;
        for(int j = 0; j < i; j++){
            data =  data*10+dig[j];
            low *= 10;
        }
        a += data - low/10+1;
    }

    if(a > M) {
        printf("0
");
        return 0;
    }
    if(a == M){
        printf("%I64d
",K);
        return 0;
    }
    ll b = M-a;

    for(int i = sz+1; ; i++){
        ll data = 0,low = 1;
        for(int j = 0; j < i; j++){
            data = data*10+dig[j];
            low *= 10;
        }
        ll t = data - low/10;
        if(!t) { printf("0
"); return 0; }
        if(b <= t){
            low /= 10;
            printf("%I64d
",b-1+low);
            return 0;
        }
        b -= t;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/jerryRey/p/4782394.html