#include<bits/stdc++.h>
#define int unsigned long long
using namespace std;
int T;
signed main(){
cin>>T;
while(T--){
int k, x;
cin>>k>>x;
int new_ = 0;
string a = "";
while(k){
int c = k%10;
if(c > x){
c--;
}
a += c+'0';
k/=10;
}
for(int i=0;i<=a.length()-1;i++){
new_ += (a[i]-'0')*pow(9,i);
}
cout<<new_+1<<endl;
}
return 0;
}
我是按照出题人给的题解做的:
先 考 虑 x = 9 的 情 况 , 我 们 有 8 之 后 是 10 , 188 之 后 是 200 。 不 难 发 现 这 其 实 就 是 逢 九 进 一 也 就 是 说 新 的 数 列 其 实 就 是 九 进 制 数 , 那 我 们 想 求 它 是 第 几 个 其 实 就 是 把 这 个 九 进 制 数 转 换 成 十 进 制 数 。
那 么 再 看 x = 9 的 情 况 , 其 实 和 上 一 种 情 况 是 一 样 的 , 把 所 有 大 于 x 的 数 位 都 减 一 是 不 改 变 数 的 顺 序 的 , 那 我 们 将 所 有 大 于 x 的 数 位 都 减 一 后 新 的 数 列 也 是 九 进 制 数 , 转 成 十 进 制 即 可 要 注 思 的 是 自 然 数 是 包 括 0 的 , 所 以 最 后 答 案 要 加 一
为什么提交之后会RE