#include #define maxn 10010 #define mo 1000000007 using namespace std; inline int read(){ int x=0,f=1;char cc=getchar(); while(cc<'0' || cc>'9') {if(cc=='-') f=-1;cc=getchar();} while(cc>='0' && cc<='9') {x=x*10+cc-'0';cc=getchar();} return x*f; } int tt,ttt,a[maxn],s[maxn<<2],f[maxn],g[maxn],p[maxn],n,m,ans[maxn]; inline void fix(int p,int l,int r,int i,int j){ s[p]=max(s[p],j); if(l==r) return; if((l+r)>>1>=i) fix(p<<1,l,(l+r)>>1,i,j); else fix((p<<1)+1,((l+r)>>1)+1,r,i,j); } inline int qs(int p,int l,int r,int i){ if(r<=i) return s[p]; int x=qs(p<<1,l,(l+r)>>1,i); if((l+r)>>1>1)+1,r,i)); return x; } inline void go(int p,int l,int r,int i,int j){ s[p]=(s[p]+j)%mo; if(l==r) return; if((l+r)>>1>=i) go(p<<1,l,(l+r)>>1,i,j); else go((p<<1)+1,((l+r)>>1)+1,r,i,j); } inline int qt(int p,int l,int r,int i){ if(r<=i) return s[p]; int x=qt(p<<1,l,(l+r)>>1,i); if((l+r)>>1>1)+1,r,i))%mo; return x; } int main(){ ttt=read(); for(tt=1;tt<=ttt;tt++){ n=read(); for(int i=1;i<=n;i++) a[i]=read(); for(int i=1;i<=n<<2;i++) s[i]=0; for(int i=1;i<=n;i++){ if(a[i]==1){ p[i]=1; fix(1,1,n,1,1); continue; } p[i]=qs(1,1,n,a[i]-1)+1; fix(1,1,n,a[i],p[i]); } m=0;for(int i=1;i<=n;i++) m=max(m,p[i]); for(int i=1;i<=n;i++) f[i]=1;ans[1]=n; for(int i=2;i<=m;i++){ for(int j=1;j<=n<<2;j++) s[j]=0; for(int j=1;j<=n;j++){ if(a[j]==1){ g[j]=0; go(1,1,n,1,f[j]); continue; } g[j]=qt(1,1,n,a[j]-1); go(1,1,n,a[j],f[j]); } for(int j=1;j<=n;j++) f[j]=g[j]; ans[i]=0; for(int j=1;j<=n;j++) ans[i]=(ans[i]+f[j])%mo; } printf("Case #%d:",tt); for(int i=1;i<=m;i++) printf(" %d",ans[i]); for(int i=m+1;i<=n;i++) printf(" 0");printf("\n"); } }