#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<unordered_set>
#include<unordered_map>
using namespace std;

#define ll long long
#define all(x) (x).begin(),(x).end()
const int N=1e5+10;
const int mod=1e9+7;

ll n,a[N],cnt[N];
// 1*6 2*3 2*8 4*4 4*9 6*6
// 以i结尾 相乘是j的子序列的数量 DP
// 以i结尾 相乘是j的子序列的权值 g 
ll dp[N][10],g[N][10],res[N][10]; 
void solve(){
	ll ans=0;
	dp[1][a[1]]=1; 
	if(a[1]==6) g[1][a[1]]=1,res[1][a[1]]=1;
	
	// 先暴力 再优化 
	for(int i=2;i<=n;i++){
		// 自己单独作为一个子序列
		dp[i][a[i]]=1; 
		if(a[i]==6) g[i][a[i]]=1,res[i][a[i]]=1;
		
//		//  与前面的子序列拼接 
//		for(int j=1;j<i;j++){
//			for(int k=0;k<=9;k++){
//				int x=k*a[i]%10;
//				dp[i][x]+=dp[j][k]; 
//				if(x!=6) g[i][x]+=g[j][k];
//				else{
//					g[i][x]+=g[j][k]+dp[j][k];
//				}
//				dp[i][x]%=mod,g[i][x]%=mod;
//			}
//		}
		// 前缀和优化 
		for(int k=0;k<=9;k++){
			int x=k*a[i]%10;
			dp[i][x]+=dp[i-1][k];
			g[i][x]+=g[i-1][k],res[i][x]=g[i][x];
			if(x==6) g[i][x]+=dp[i-1][k],res[i][x]=g[i][x];
			dp[i][x]%=mod,g[i][x]%=mod,res[i][x]%=mod;
		}
		for(int k=0;k<=9;k++) dp[i][k]+=dp[i-1][k],dp[i][k]%=mod;
		for(int k=0;k<=9;k++) g[i][k]+=g[i-1][k],g[i][k]%=mod;
	}
	for(int i=1;i<=n;i++)
		for(int j=0;j<=9;j++) ans=(ans+res[i][j])%mod;
	cout<<ans; 
}
int main(){
	ios::sync_with_stdio(false),cin.tie(0);
	
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i],a[i]%=10,cnt[a[i]]++;
	solve();
	return 0;
}