#include <bits/stdc++.h>
#define MOD 1000000007LL
using namespace std;
typedef long long ll;

typedef vector<ll> vec;
typedef vector<vec> mat;

mat mul(mat &A,mat &B){
	mat C(A.size(),vec(B[0].size()));
	for(int i=0;i<A.size();i++){
		for(int k=0;k<B.size();k++){
			for(int j=0;j<B[0].size();j++){
				C[i][j]=(C[i][j]+(A[i][k]*B[k][j]%MOD))%MOD;
			}
		}
	}
	return C;
}

mat pow(mat A,ll n){
	mat B(A.size(),vec(A.size()));
	for(int i=0;i<A.size();i++){
		B[i][i]=1;
	}
	while(n>0){
		if(n&1)B=mul(B,A);
		A=mul(A,A);
		n>>=1;
	}
	return B;
}

ll matpow(ll x,ll n){
	ll ret=1;
	while(n>0){
		if(n&1)ret=ret*x%MOD;
		x=x*x%MOD;
		n/=2LL;
	}
	return ret;
}

bool isnumber(string s){
	for(int i=0;i<s.size();i++){
		if(!isdigit(s[i]))return false;
	}
	return true;
}

ll getnum(string s){
	ll res=0;
	for(int i=0;i<s.size();i++){
		res*=10LL;
		res+=(s[i]-'0');
		res%=MOD;
	}
	return res;
}

typedef string::const_iterator State;
ll number(State &begin){
	ll ret=0;
	while(isdigit(*begin)){
		ret*=10;
		ret+=(*begin-'0');
		begin++;
	}
	ret%=MOD;
	return ret;
}

ll term(State &begin){
	ll ret=number(begin);
	while(1){
		if(*begin=='*'){
			begin++;
			ret*=number(begin);
			ret%=MOD;
		}else{
			break;
		}
	}
	return ret;
}
ll expression(State &begin){
	ll ret=term(begin);
	while(1){
		if(*begin=='+'){
			begin++;
			ret+=term(begin);
			ret%=MOD;
		}else{
			break;
		}
	}
	return ret;
}

ll getval(string s,int f){
	string ss=s.substr(f);
	if(f!=0)ss+=s.substr(0,f-1);
	else{
		ss=s.substr(0,s.size()-1);
	}
	State st=ss.begin();
	return expression(st);
}

string replace_str(string s){
	string res="";
	for(int i=0;i<s.size();i++){
		if(s[i]=='-'){
			res+="+1000000006*";
		}else{
			res+=s[i];
		}
	}
	return res;
}

int n;
int r[10005];
ll tp[15];

int main(void){
	scanf("%d%*c",&n);
	tp[0]=1;
	for(int i=0;i<14;i++){
		tp[i+1]=tp[i]*10LL%MOD;
	}
	ll ans=0;
	ll pv=1;
	ll nowv=0;
	for(int i=0;i<n;i++){
		string s;
		cin >> r[i] >> s;
		ll val=0;
		if(isnumber(s)){
			mat A(2,vec(2));
			A={{tp[s.size()],getnum(s)},{0,1}};
			A=pow(A,r[i]);
			nowv=((nowv*A[0][0])%MOD+A[0][1])%MOD;
			continue;
		}
		bool flag=false;
		for(int j=0;j<s.size();j++){
			if(s[j]=='+' || s[j]=='-'){
				flag=true;
			}
		}
		if(!flag){
			int mi=0;
			for(mi=0;mi<s.size();mi++){
				if(s[mi]=='*' || s[mi]=='+' || s[mi]=='-')break;
			}
			for(int j=0;j<mi;j++){
				nowv*=10LL;
				nowv+=(s[j]-'0');
				nowv%=MOD;
			}
			pv=nowv*pv%MOD;
			if(r[i]>1){
				nowv=getval(s,(mi+1)%s.size());
				nowv=matpow(nowv,r[i]-1);
				pv=nowv*pv%MOD;
			}
			nowv=0;
			for(int j=mi+1;j<s.size();j++){
				if(s[j]=='*'){
					pv=pv*nowv%MOD;
					nowv=0;
				}else{
					nowv*=10LL;
					nowv+=(s[j]-'0');
					nowv%=MOD;
				}
			}
		}else{
			s=replace_str(s);
			int mi=0;
			for(mi=0;mi<s.size();mi++){
				if(s[mi]=='+')break;
			}
			for(int j=0;j<mi;j++){
				if(s[j]=='*'){
					pv=pv*nowv%MOD;
					nowv=0;
				}else{
					nowv*=10LL;
					nowv+=s[j]-'0';
					nowv%=MOD;
				}
			}
			ans+=nowv*pv%MOD;
			ans%=MOD;
			if(r[i]>1){
				nowv=getval(s,(mi+1)%s.size());
				nowv*=r[i]-1;
				ans+=nowv%MOD;
				ans%=MOD;
			}
			pv=1;
			nowv=0;
			for(int j=mi+1;j<s.size();j++){
				if(s[j]=='*'){
					pv=pv*nowv%MOD;
					nowv=0;
				}else if(s[j]=='+'){
					ans+=nowv*pv%MOD;
					ans%=MOD;
					pv=1;
					nowv=0;
				}else{
					nowv*=10LL;
					nowv+=s[j]-'0';
					nowv%=MOD;
				}
			}
		}
	}
	ans+=nowv*pv%MOD;
	ans%=MOD;
	printf("%lld\n",ans);
	return 0;
} 


Measured memory_bytes: 3360