拖了很久才补的题,很巧妙的一道构造。
最优情况是类似x999c, c是个位,x不一定只是一位数。然后我们就进行枚举c和9的个数,注意在计算和的时候我们先不考虑x,因为最优情况x的末尾不是9,所以x在进位时,x并不会变化,也就是说剩余的价值一定得是x*(k+1)。此时我们得到一个x的数字和也就是题中的f(x), 然后再对x进行构造获得最小的x。x的结构一定是b999d,为了让x最小且符合最优情况d要尽可能大但又要小于9,也就是说如果剩下的价值可以让d等于8,d就是8,然后前面尽量排9,剩下的一位就是b了。
#include<cstdio>
#include<stdlib.h>
#include<algorithm>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<vector>
#include<queue>
#include<math.h>
#include<climits>
#include<set>
#include<sstream>
#include<time.h>
#include<iomanip>
#include<bits/stdc++.h>
#define debug(x) cout <<#x<<" = "<<x<<endl
#define debug2(x, y) cout<<#x<<" = "<<x<<", "<<#y<<" = "<<y<<endl
#define gg cout <<"---------------QAQ---------------"<<endl
#define fi first
#define SZ(x) (int)x.size()
#define se second
#define pb push_back
#define MEM(a) memset(a, 0, sizeof(a))
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
#define PI cos(-1)
#define endl "\n"
#define eps 1e-8
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<int, pii> piii;
template<class T> inline void read(T &x){
x=0; char c=getchar(); int f=1;
while (!isdigit(c)) {if (c=='-') f=-1; c=getchar();}
while (isdigit(c)) {x=x*10+c-'0'; c=getchar();} x*=f;
}
const int N = 3e5+10, maxn = 1e6+10;
//void FAST(){ios::sync_with_stdio(false);cin.tie(nullptr); cout.tie(nullptr);}
const ll mod = 1e9+7;
int n, m, k;
ll ans;
void solve()
{
ans = -1;
scanf("%d%d", &n, &k);
for(int c = 0; c <= 9; ++c)
for(int d = 0; 9*d+c <= n; ++d)
{
int b = 0;
for(int i = 0;i <= k; ++i)
b += (i+c)%10+(i+c<10?9*d:1);
b = n-b;
if(b<0||b%(k+1)!=0) continue;
int x = b/(k+1);
ll v;
if(x<8) v = x;
else {
x -= 8;
v = x%9;
for(int i = 0; i < x/9; ++i)
v = 10*v+9;
v = 10*v+8;
}
for(int i = 0;i < d; ++i)
v = 10*v+9;
v = 10*v+c;
if(v<1e18&&(ans==-1||v<ans)) ans = v;
}
printf("%lld\n", ans);
}
int main(){
int _; scanf("%d", &_); while(_--)
// while(~scanf("%d", &n))
// while(scanf("%d", &n)&&n)
solve();
return 0;
}