您的位置:首页 > 运维架构

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

2015-09-04 21:35 615 查看
其实挺简单的。先直接算出之前已经排在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\n");
return 0;
}
if(a == M){
printf("%I64d\n",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\n"); return 0; }
if(b <= t){
low /= 10;
printf("%I64d\n",b-1+low);
return 0;
}
b -= t;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: