#include #include #include #define REP(i,a,b) for(i=a;ik);if(i>=j)break;t=d[i];d[i]=d[j];d[j]=t;}intSort(d,i);intSort(d+j+1,s-j-1);} ll dp[300000]; int ok_digit[300000]; int mx[1025][1025]; int main(){ int i,j,k,l,m,n; int W[51]; int dig_size, dig[10], now, mask; ll res; int T; /* preculc */ rep(i,1<<18){ rep(j,9){ k = (i>>(2*j))%4; if(k==0 || k==2) break; } ok_digit[i] = j; } rep(i,1<<10) rep(j,1<<10){ k = 0; rep(n,5){ l = (i>>(n*2))%4; m = (j>>(n*2))%4; if(l < m) l = m; k |= (l<<(n*2)); } mx[i][j] = k; } scanf("%d",&T); while(T--){ scanf("%d",&n); rep(i,n) scanf("%d",W+i); intSort(W, n); res = 0; rep(i,1<<18) dp[i] = 0; dp[0] = 1; rep(k,n){ dig_size = 0; while(W[k]) dig[dig_size++] = W[k]%10, W[k]/=10; rep(i,dig_size){ if(dig[i] < 4) dig[i] = 0; else if(dig[i] == 4) dig[i] = 1; else if(dig[i] < 7) dig[i] = 2; else if(dig[i] == 7) dig[i] = 3; else break; } if(i < dig_size) continue; now = 0; rep(i,dig_size) now |= (dig[i]<<(2*i)); for(i=(1<<(2*dig_size))-1;i>=0;i--) if(dp[i]){ mask = (mx[i/(1<<10)][now/(1<<10)]<<10) | mx[i%(1<<10)][now%(1<<10)]; if(ok_digit[mask] == dig_size) res += dp[i]; dp[mask] += dp[i]; } } printf("%lld\n",res); } return 0; }