#include <iostream>
#include <vector>
using namespace std;
int base[10];
int f[10][10];
int g[10][10];
void init()
{
base[0] = 1;
for(int i = 1 ; i <= 9 ; i++) base[i] = base[i-1]*10;
/*
从00……0 - 99……9 的各位数字有多少个,其中i为数字个数(包含前导零)
f[i][j] i个数字组成的数中 包含j的个数
[1~n]位数中包含j的个数 = [0~9] * f[1~n-1] ((1~n-1)位中包含j的数个数)
+[j] * cnt[1~n-1] (第n位填j后 n-1位数字总共有10^(n-1)个)
= 10 * f[n-1][j]
+ 10^(n-1)
f[2][1] = 10 *f[1][1] + 10^(2-1)
=[01,11,21,31,41,51,61,71,81,91]中十位填[0~9]情况下 个位上的1的个数
+[10,11,12,13,14,15,16,17,18,19]中十位上的1的个数
=20
f[3][1] = 10 *f[2][1] + 10^(3-1)
=[0~9] concat [01,11,21,31,41,51,61,71,81,91,10,11,12,13,14,15,16,17,18,19] 中百位填[0~9]情况下 个位及十位上1的个数
+[1] concat [00~99] 中百位上1的个数
= 10 * 20 + 10^2
= 300
*/
for(int i = 0 ; i <= 9 ; i++) f[1][i] = 1;
for(int i = 2 ; i <= 9 ; i++)
for(int j = 0 ; j <= 9 ; j++)
f[i][j] = f[i-1][j]*10 + base[i-1];
//从1 - 99……9 的各位数字有多少个,其中i为数字个数(不包含前导零)
/*
从00……0 - 99……9 的各位数字有多少个,其中i为数字个数(不包含前导零)
g[i][j] i个数字组成的数中 包含j的个数
1~99999 分为1~9999 + 10000~99999
g[i-1][j]+ [1~9] * f[i-1][j] + [j] * 10^4(0000~9999)
[1~n]位数中包含j的个数 =g[i-1][j]
+[1~9] * f[1~n-1] ((1~n-1)位中包含j的数个数)
+[j] * cnt[1~n-1] (第n位填j后 n-1位数字总共有10^(n-1)个)
= 10 * f[n-1][j]
+ 10^(n-1)
1~99 分为1~9 + 10~99
g[2][1] = g[2-1][1] + 9 *f[1][1] + 10^(2-1)
=[1] 1~9中包含1的个数
[11,21,31,41,51,61,71,81,91]中十位填[1~9]情况下 个位上的1的个数
+[10,11,12,13,14,15,16,17,18,19]中十位上的1的个数
=20
1~999分为1~99+100~999
g[3][1] = g[3-1][1] +9 *f[2][1] + 10^(3-1)
=[1,11,21,31,41,51,61,71,81,91,10,11,12,13,14,15,16,17,18,19]
+[1~9] concat [1,11,21,31,41,51,61,71,81,91,10,11,12,13,14,15,16,17,18,19] 中百位填[0~9]情况下 个位及十位上1的个数
+[1] concat [00~99] 中百位上1的个数
= 20 + 9 * 20 + 10^2
= 300
*/
for(int i = 1 ; i <= 9 ; i++) g[1][i] = 1;//循环从1开始
for(int i = 2 ; i <= 9 ; i++) {
g[i][0] = g[i-1][0] + f[i-1][0]*9;
for(int j = 1 ; j <= 9 ; j++)
g[i][j] = g[i-1][j] + f[i-1][j]*9 + base[i-1];
}
}
vector<int> dp(int n)
{
vector<int> res(10,0); //记录答案
if(n<=0) return res; //边界条件
vector<int> nums;
while(n) nums.push_back(n%10), n/=10;
vector<int> last(10,0); //记录前缀中各个数字个数
//统计1 - 99……9(n-1个9)里面各个数字有多少个 g[n-1][i] n-1位数中 i的个数
for(int i = 0 ; i <= 9 ; i++) res[i] = g[nums.size()-1][i];
//统计大于10……0(n-1个0) 的树(10...0~99..9 n个9)里各个数字有多少个
for(int i = nums.size()-1 ; i >=0 ; i--) {
//循环变量i可以表示剩下的数字有多少个
int x = nums[i];
// j从0~x
// 当i为最大位时 j从1开始
// 当i不为最大位时 j从0开始
for(int j = i==nums.size()-1 ; j < x ; j++) { //第一次循环不能有0
//已经确定了的前缀部分
// [111]j..... last[1] = 3 则res[1]+=3*10^5
for(int k = 0 ; k <= 9 ; k++)
res[k] += last[k] * base[i];
//当前第i位取j 部分
//111 [j]..... res[j]+=10^5
res[j] += base[i];
//剩余位 后缀部分
//111 j [.....]
// f[i][k] 共i位中 数字0~9各出现的次数
for(int k = 0 ; k <= 9 ; k++)
res[k] += f[i][k];
}
//第i位取a[i] = nums[i] 进入右子树
//更新前缀计数器
last[x] ++;
//统计叶子节点(这个数本身)
// a1a2a3...an 中 0~9各出现了多少次
// 举例 11122334 中res[1]=3 res[2] = 2 res[3]=2 res[4]=1
if(!i) for(int k = 0 ; k <= 9 ; k++) res[k] += last[k];
}
return res;
}
vector<int> ask(int a, int b)
{
auto x = dp(b);
auto y = dp(a-1);
vector<int> ans;
for(int i = 0 ; i <= 9 ; i++) ans.push_back(x[i]-y[i]);
return ans;
}
int main()
{
init();
int a,b;
while(cin >> a >> b, a||b) {
if(a>b) swap(a,b);
auto t = ask(a,b);
for(auto x:t) cout << x << ' ';
cout << endl;
}
return 0;
}