/* *********************************************** Author :yang12138 Created Time :2018年08月04日 星期六 21时55分22秒 File Name :1005.cpp ************************************************ */ #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define mem(a,b) memset(a,b,sizeof(a)) typedef long long ll; typedef pairpii; #define lson (root<<1) #define rson (root<<1|1) const int N=10005; const int K=250; const int mod=1e9+7; pii dat[N]; void addmod(ll& x,ll y){ x+=y; if(x>=mod) x-=mod; } struct Node{ ll cnt[K]; Node(){ memset(cnt,0,sizeof(cnt)); } void clear(){ memset(cnt,0,sizeof(cnt)); } Node operator + (const Node& tmp)const{ Node ans; for(int i=0;i>1; build(lson,l,m); build(rson,m+1,r); } void update(int root,int l,int r,int pos,const Node& v){ t[root]=t[root]+v; if(l==r) return ; int m=(l+r)>>1; if(pos<=m) update(lson,l,m,pos,v); else update(rson,m+1,r,pos,v); } Node query(int root,int l,int r,int a,int b){ if(a>b) return Node(); if(l==a && r==b) return t[root]; int m=(l+r)>>1; if(b<=m) return query(lson,l,m,a,b); else if(a>m) return query(rson,m+1,r,a,b); else { Node lans=query(lson,l,m,a,m); Node rans=query(rson,m+1,r,m+1,b); return lans+rans; } } ll ans[N]; void solve(int t){ int n; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&dat[i].first),dat[i].second=i; sort(dat+1,dat+n+1); memset(ans,0,sizeof(ans)); build(1,1,n); for(int i=1;i<=n;i++){ Node tmp=query(1,1,n,1,dat[i].second); for(int i=K-1;i>=2;i--){ tmp.cnt[i]=tmp.cnt[i-1]; addmod(ans[i],tmp.cnt[i]); } tmp.cnt[1]=1; update(1,1,n,dat[i].second,tmp); } printf("Case #%d:",t); ans[1]=n; if(n<=K-1){ for(int i=1;i<=n;i++) printf(" %I64d",ans[i]); printf("\n"); return ; } for(int i=1;i<=K-1;i++) printf(" %I64d",ans[i]); for(int i=K;i<=n;i++) printf(" 0"); printf("\n"); } int main(){ //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int T,t=0; scanf("%d",&T); while(T--) solve(++t); return 0; }