import java.io.*;
import java.util.*;
public class Main {
static final int MOD = 1000000007;
static final int N = 200005;
static int[] arr = new int[N];
static int[][] dp = new int[N][10];
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
for (int i = 1; i <= n; i++) {
int t = in.nextInt();
arr[i] = (n > 1) ? t % 10 : t;
}
// dp[i][j]:合并到剩余 i 个数,且合并结果为 j 的方案数
// 注意,当 n = 1 且 arr[1] > 9 时,无法合并,所以不能初始化直接跳过
if (n == 1 && arr[1] > 9){
for (int i = 0; i < 10; i++) System.out.print(dp[1][i] + " ");
return;
}
// 初始化未开始合并,结果就只能是 arr[n] % 10
// 即 dp[n][arr[n] % 10] = 1 ,方案数为 1
dp[n][arr[n] % 10]++;
// 状态转移
// 操作① :dp[i][(arr[i] + j) % 10] += dp[i+1][j], 0 <= j <= 9 (作为上一次合并的结果)
// 合并到剩余 i 个数,结果为 (当前数 + 上一次合并的结果 % 10) 的方案数 = ∑ dp[i+1][j] (对上次合并结果为 j 的求和)
// 操作②:dp[i][(arr[i] * j) % 10] += dp[i+1][j]
// 合并到剩余 i 个数,结果为 (当前数 * 上一次合并的结果 % 10) 的方案数 = ∑ dp[i+1][j] (对上次合并结果为 j 的求和)
for (int i = n; i > 1; i--) {
for (int j = 0; j <= 9; j++) {
dp[i - 1][(arr[i - 1] + j) % 10] = (dp[i - 1][(arr[i - 1] + j) % 10] + dp[i][j]) % MOD;
dp[i - 1][(arr[i - 1] * j) % 10] = (dp[i - 1][(arr[i - 1] * j) % 10] + dp[i][j]) % MOD;
}
}
for (int i = 0; i < 10; i++) System.out.print(dp[1][i] + " ");
}
}