#include<cstdio>
#include<cstring>
#include<algorithm>

#define rep(i,n) for(int i=0;i<(n);i++)

using namespace std;

typedef long long ll;

const ll M=1000000007;

const int N_BIN=200;
ll nCr[N_BIN+1][N_BIN+1];
void binom(){
	rep(n,N_BIN+1) nCr[n][0]=1;
	rep(n,N_BIN) rep(r,n+1) nCr[n+1][r+1]=(nCr[n][r+1]+nCr[n][r])%M;
}

ll fact[201];

void calc_dp(int n,const int *len,ll dp[200][800]){
	dp[0][0]=1;
	rep(i,n) for(int k=n-1;k>=0;k--) for(int j=4*n-len[i];j>=0;j--) {
		dp[k+1][j+len[i]]=(dp[k+1][j+len[i]]+dp[k][j])%M;
	}
	rep(i,n+1) rep(j,4*n+1) dp[i][j]=dp[i][j]*fact[i]%M; // 並び順が違うものは区別する
}

ll solve(int n,const int *a){
	int len[200];
	rep(i,n){
		char s[8]; sprintf(s,"%d",a[i]);
		len[i]=strlen(s);
	}

	ll cnt[200]={}; // cnt[i] := ( i 個のものからいくつか選んで一列に並べる場合の数 )
	rep(i,n) rep(j,i+1) cnt[i]=(cnt[i]+nCr[i][j]*fact[j])%M;

	// dp[i][j][k] := ( a[0..n-1] から i+1 桁の数を一つ取り除いた数列において, j 個の数をつなげて k 桁の数を作る場合の数 )
	static ll dp[4][200][800];
	rep(i,4) rep(j,n) rep(k,4*n) dp[i][j][k]=0;
	rep(i,4){
		int pos=-1;
		rep(j,n) if(len[j]-1==i) pos=j;
		if(pos!=-1){
			swap(len[pos],len[n-1]);
			calc_dp(n-1,len,dp[i]);
			swap(len[pos],len[n-1]);
		}
	}

	ll ans=0;
	rep(i,n){
		ll ten=1;
		rep(j,4*n){
			rep(k,n){
				ans+=cnt[n-k-1]*dp[len[i]-1][k][j]%M*a[i]%M*ten%M;
				ans%=M;
			}
			ten=ten*10%M;
		}
	}
	return ans;
}

int main(){
	binom();
	fact[0]=1;
	rep(i,200) fact[i+1]=(i+1)*fact[i]%M;

	int n; scanf("%d",&n);
	int a[200],zero=-1;
	rep(i,n){ scanf("%d",a+i); if(a[i]==0) zero=i; }

	ll ans=solve(n,a);
	if(zero!=-1){
		swap(a[zero],a[n-1]);
		ans=(ans-solve(n-1,a)+M)%M;
	}
	printf("%lld\n",ans);

	return 0;
}