#include using namespace std; #define MOD 1000000007 int t, n, ans[10005], bi, at, ad; vector>> v[10005]; int ta, tb; void add(int& a, int b) { a += b; if (a >= MOD) a -= MOD; } int get(int a, int b, int c) { if (c == ta) return v[at][a].first; if (b + 2 == c) return v[at][a].second.first; int mi = (b + c) / 2; if (ta <= mi) { if (v[at][a].second.first) return get(v[at][a].second.first, b, mi); return 0; } int ret = 0; if (v[at][a].second.first) ret = v[at][v[at][a].second.first].first; if (v[at][a].second.second) add(ret, get(v[at][a].second.second, mi, c)); return ret; } int main() { scanf("%d", &t); for (int tt = 1; tt <= t; tt++) { scanf("%d", &n); bi = 1; while (n >= (1 << bi)) bi++; for (int i = 0; i <= n; i++) v[i].push_back({0, {0, 0}}); for (int i = 1; i < bi; i++) { v[0].back().first = 1; v[0].back().second.first = i; v[0].push_back({0, {0, 0}}); } v[0].back().first = 1; v[0].back().second.first = 1; for (int i = 1; i <= n; i++) { scanf("%d", &ta); ad = 0; for (at = 0; ; ) { tb = get(0, 0, 1 << bi); // printf("%d %d %d\n", i, at, tb); if (ad) { int tmp = 0; for (int j = bi - 1; j; j--) { add(v[at][tmp].first, ad); if (ta & (1 << j)) { if (!v[at][tmp].second.second) { v[at][tmp].second.second = v[at].size(); v[at].push_back({0, {0, 0}}); } tmp = v[at][tmp].second.second; } else { if (!v[at][tmp].second.first) { v[at][tmp].second.first = v[at].size(); v[at].push_back({0, {0, 0}}); } tmp = v[at][tmp].second.first; } } add(v[at][tmp].first, ad); if (ta & 1) add(v[at][tmp].second.second, ad); else add(v[at][tmp].second.first, ad); } if (tb == 0) break; at++; add(ans[at], tb); ad = tb; } } printf("Case #%d: ", tt); for (int i = 1; i <= n; i++) { printf("%d%c", ans[i], i == n ? '\n' : ' '); ans[i] = 0; } for (int i = 0; i <= n; i++) v[i].clear(); } return 0; }