其实挺简单的。先直接算出之前已经排在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; }