#include using namespace std; const int maxn = 1e4 + 10; typedef long long ll; const int mod = 1e9 + 7; const int SIZE = 300; int dp[SIZE][maxn], mx; void update(int *dp, int x, int val) { for (int i = x; i <= mx; i += i & (-i)) { dp[i] += val; dp[i] %= mod; } } int getSum(int *dp, int x) { int ans = 0; for (int i = x; i > 0; i -= i & (-i)) { ans += dp[i]; ans %= mod; } return ans; } //int r[10000]; int main() { int T; scanf("%d", &T); for (int c = 1; c <= T; c++) { int n, x; scanf("%d", &n); for (int i = 0; i < SIZE; i++) { memset(dp[i], 0, sizeof(dp[i])); } mx = n; // for (int i = 0; i < n; i++) { // r[i] = i + 1; // } // random_shuffle(r, r + n); for (int i = 1; i <= n; i++) { scanf("%d", &x); // int x = r[i - 1]; // cout << x << " "; for (int j = 1; j < SIZE; j++) { update(dp[j], x, getSum(dp[j - 1], x - 1)); // dp[j][x] += dp[j - 1][1~x]; } update(dp[1], x, 1); } printf("Case #%d: ", c); int mi = min(SIZE - 1, n); for (int i = 1; i <= mi; i++) { printf("%d%c", getSum(dp[i], n), i == n ? '\n' : ' '); // if (getSum(dp[i], n) == 0) { // } } for (int i = mi + 1; i <= n; i++) { printf("0%c", i == n ? '\n' : ' '); } } return 0; }