题意:
题解:
好久没做22的题目现在变得这么难了吗?也可能是我变菜了,居然用了半个多小时
首先k<=9,所以最多只进一位,那么答案就有可能是这个样子的:
或者是这样子的
又或者
那么暴力的枚举减9的倍数的起点和9的个数,然后由于确定了-9的起点也就是确定了x的个位,确定了9的倍数的个数也就是确定了在第j+1位一定是<=8。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll deal(int x,int ge,int h){//个位数必须是ge,高度=h+1时必须不是9
x-=ge;
h--;
ll ret=ge;
while(x-9>=0&&h--)
ret=ret*10+9,x-=9;
if(x-8>=0)
ret=ret*10+8,x-=8;
while(x-9>=0)
ret=ret*10+9,x-=9;
if(x)
ret=ret*10+x;
ll ans=0;
while(ret)
ans=ans*10+ret%10,ret/=10;
if(ge==0)
ans=ans*10;
return ans;
}
int main()
{
int t;
scanf("%d",&t);
while(t--){
int n,k;
scanf("%d%d",&n,&k);
k++;
int x;
ll ans=1e18;
if((n-k*(k-1)/2)%k==0){
x=(n-k*(k-1)/2)/k;
for(int i=0;i<=9&&i<=x&&i<=10-k;i++)
ans=min(ans,deal(x,i,100));
}
else{
for(int i=2;i<=k;i++){
for(int j=1;j<=15;j++){
if((n+(k-i+1)*j*9-(k-1)*k/2)%k==0){
x=(n+(k-i+1)*j*9-(k-1)*k/2)/k;
if(1+9*j<=i-1+x)
ans=min(ans,deal(x,10-i+1,j));
}
}
}
}
printf("%lld\n",ans<1e18?ans:-1);
}
return 0;
}