void main(){
  import std.stdio, std.string, std.conv, std.algorithm;

  int n; rd(n);
  auto q=readln.split.to!(int[]);

  const int m=1_000_000+5;
  auto isPrime=new bool[](m);
  fill(isPrime, true);
  isPrime[1]=false;
  for(int i=2; i*i<=m; i++)if(isPrime[i]){
    for(int j=2; i*j<m; j++) isPrime[i*j]=false;
  }

  const long mod=1_000_000_000+7;

  auto dp_p=new long[](n), dp_e=new long[](n);
  dp_p[0]=(isPrime[q[0]] ? 1L : 0L);
  for(int i=1; i<n; i++){
    if(isPrime[q[i-1]]) (dp_e[i]+=dp_p[i-1])%=mod;
    if(isPrime[q[i]]){
      if(isPrime[q[i-1]] && q[i-1]<q[i]) (dp_p[i]+=dp_p[i-1])%=mod;
      if(i-2>=0 && isPrime[q[i-2]] && q[i-2]<q[i]) (dp_p[i]+=dp_e[i-1])%=mod;
    }
  }

  writeln((dp_p[n-1]+dp_e[n-1])%mod);

}

/+
  qi: 素数
    dp_e[i]=dp_p[i-1]
    q(i-1):素数 and q(i-1)<qi: dp_p[i]+=dp_p[i-1]
    q(i-2):素数 and q(i-2)<qi: dp_p[i]+=dp_p[i-2] ? xx
                               dp_p[i]+=dp_e[i-1] ? ok
  qi: 合成数
    dp_e[i]=dp_p[i-1]
+/

void rd(T...)(ref T x){
  import std.stdio, std.string, std.conv;
  auto l=readln.split;
  assert(l.length==x.length);
  foreach(i, ref e; x){
    e=l[i].to!(typeof(e));
  }
}

