首先 如果数位和sum > m就不用拆分 直接输出就好
现在就需要将10^k拆成10个10^(k-1)
重点是如何选哪个进行拆分 贪心思想
拆小的数就行 因为拆小的数损失的最少 所以我们就拆拆开后最小的数就行(1不算)
还有小细节就是个拆成m-1个之后 把最后的归为一个数输出
其它的看代码吧。
想明白也就是个sb题
#include <bits/stdc++.h>
#define pb push_back
#define xx first
#define yy second
#define in(x) scanf("%d",&x)
#define lin(x) scanf("%lld",&x)
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
const int N = 2e6+10;
const int M = N*2;
const int MOD = 1e9+7;
const int INF = 0x3f3f3f3f;
const double eps = 1e-7;
const double PI = acos(-1);
ll qpow(ll a,ll b){ll res = 1;while(b){if(b&1) res = res*a%MOD;a = a*a%MOD;b >>= 1;}return res;}
int n,m,k,T;
int A[N];
char str[N];
int base[10] = {1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000};
vector <int> V;
vector <int> ans;
signed main(){
#ifndef ONLINE_JUDGE
freopen("1.in","r",stdin);
#endif
in(T);
while(T--){
in(n),in(m);
V.clear();
int tp = n;
while(tp) V.pb(tp%10),tp /= 10;
int sum = 0,len = V.size();
for(int i = 0;i < len;i++) sum += V[i];
if(sum >= m){
for(int i = 0;i < len && m > 1;i++){
for(int j = 0;j < V[i] && m > 1;j++){
printf("%d ",base[i]);
n -= base[i],m --;
}
}
printf("%d\n",n);
}else{
int tp = 1,l = 0;
while(V[l] == 0) l++;
ans.clear();
int cnt1 = 0; // 1 不能够继续分解 所以需要单独提出
for(int i = len-1;i >= l && m > 1;i--){ // 注意顺序 小的先分解
for(int j = 0;j < V[i] && m > 1;j++){
if(base[i] == 1) cnt1++;
else ans.pb(base[i]);
}
}
while(cnt1 + ans.size() < m){
int t = ans.back();
ans.pop_back();
if(t == 10) cnt1 += 10;
else{
for(int k = 1;k <= 10;k++) ans.pb(t/10);
}
}
for(int i = 0;i < ans.size() && m > 1;i++){
printf("%d ",ans[i]);
n -= ans[i],m--;
}
while(m > 1) printf("1 "),m--,n--;
printf("%d\n",n);
}
}
return 0;
}