#include<bits/stdc++.h>
using namespace std;
struct M_pair{
int a,b;
};
const int p=10007;
char str[100002]="";
int c1[100001]={},c2[100001]={},d1[100001]={},d2[100001]={},n=0;
M_pair dfs(int l,int r);
int main(){
scanf("%d",&n);
scanf("%s",str+1);
int tmp=0;
for(int i=1;i<=n;i++){
if(str[i]=='('){
tmp++;
}
else{
if(str[i]==')'){
tmp--;
}
else{
if(str[i]=='+'){
c1[tmp]=i;
}
else{
if(str[i]=='*'){
c2[tmp]=i;
}
}
}
}
d1[i]=c1[tmp];
d2[i]=c2[tmp];
}
M_pair ans=dfs(1,n);
printf("%d\n",ans.a);
return 0;
}
M_pair dfs(int l,int r){
M_pair ans={};
if(l>r){
ans.a=1;
ans.b=1;
return ans;
}
if(d1[r]>=l){
M_pair tl=dfs(l,d1[r]-1),tr=dfs(d1[r]+1,r);
ans.a=(tl.a*tr.a)%p;
ans.b=((tl.a*tr.b)%p+(tl.b*tr.a)%p+(tl.b,tr.b)%p)%p;
return ans;
}
if(d2[r]>=l){
M_pair tl=dfs(l,d2[r]-1),tr=dfs(d2[r]+1,r);
ans.a=((tl.a*tr.a)%p+(tl.a*tr.b)%p+(tl.b*tr.a)%p)%p;
ans.b=(tl.b*tr.b)%p;
return ans;
}
if(str[l]=='('&&str[r]==')'){
return dfs(l+1,r-1);
}
//assert(false);
return ans;
}