// CoU-BRACNet Inter-University Programming Contest 2023
// Problem A: A. Where is the Ghost
#include<bits/stdc++.h>
#include<math.h>
#define ll long long int
#define ull unsigned long long int
#include <ext/pb_ds/detail/standard_policies.hpp>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
typedef tree< ll, null_type, less<ll >, rb_tree_tag, tree_order_statistics_node_update> order_set;
#define fbo find_by_order
#define ook order_of_key
#define F first
#define S second
#define all(x) (x).begin(),(x).end()
#define print(res) cout<<#res<<" = ";for(auto x:res) cout<<x<<" "; cout<<endl
#define see(res) cout<<#res<<" = "<<res<<endl
#define fast ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0)
#define pf push_front
#define pb push_back
#define NL printf("\n")
#define YES printf("YES\n")
#define NO printf("NO\n")
#define Yes printf("Yes\n")
#define No printf("No\n")
#define tc int tc;scanf("%d",&tc);for(int cs=1;cs<=tc;cs++)
const ll N=1e6+6;
const ll mxn=2e5+6;
const ll mod=1e9+7;
ll ara[10011] , n ;
ll dp[10011][2550];
ll Fun(ll ind , ll val)
{
if(ind>n)
{
return val==0 ? 1:0 ;
}
if(dp[ind][val]!=-1) return dp[ind][val] %mod ;
ll ans = 0 ;
ans+=(Fun(ind+1 , val )); ans%=mod;
ans+=(Fun(ind+1 , (val*ara[ind])%2520) );ans%=mod;
return dp[ind][val] = ans ;
}
int main( )
{
// tc
{
memset(dp , -1 , sizeof(dp));
cin>>n ;
for(ll i=1 ; i<=n ; i++) cin>>ara[i] ;
cout<<Fun(1,1)%mod<<endl;
}
return 0;
}
//printf("Case %d: ",cs);
Ci8vIENvVS1CUkFDTmV0IEludGVyLVVuaXZlcnNpdHkgUHJvZ3JhbW1pbmcgQ29udGVzdCAyMDIzCi8vIFByb2JsZW0gQTogQS4gV2hlcmUgaXMgdGhlIEdob3N0CgoKCgojaW5jbHVkZTxiaXRzL3N0ZGMrKy5oPgojaW5jbHVkZTxtYXRoLmg+CiNkZWZpbmUgICAgbGwgICBsb25nIGxvbmcgaW50CiNkZWZpbmUgdWxsIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQKI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvc3RhbmRhcmRfcG9saWNpZXMuaHBwPgojaW5jbHVkZSA8ZXh0L3BiX2RzL2Fzc29jX2NvbnRhaW5lci5ocHA+CiNpbmNsdWRlIDxleHQvcGJfZHMvdHJlZV9wb2xpY3kuaHBwPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwp1c2luZyBuYW1lc3BhY2UgX19nbnVfcGJkczsKCnR5cGVkZWYgdHJlZTwgbGwsIG51bGxfdHlwZSwgbGVzczxsbCA+LCByYl90cmVlX3RhZywgdHJlZV9vcmRlcl9zdGF0aXN0aWNzX25vZGVfdXBkYXRlPiBvcmRlcl9zZXQ7CiNkZWZpbmUgZmJvIGZpbmRfYnlfb3JkZXIKI2RlZmluZSBvb2sgb3JkZXJfb2Zfa2V5CiNkZWZpbmUgICAgRiAgICAgZmlyc3QKI2RlZmluZSAgICBTICAgIHNlY29uZAojZGVmaW5lICAgIGFsbCh4KSAoeCkuYmVnaW4oKSwoeCkuZW5kKCkKI2RlZmluZSAgICBwcmludChyZXMpIGNvdXQ8PCNyZXM8PCIgPSAiO2ZvcihhdXRvIHg6cmVzKSBjb3V0PDx4PDwiICI7IGNvdXQ8PGVuZGwKI2RlZmluZSAgICBzZWUocmVzKSBjb3V0PDwjcmVzPDwiID0gIjw8cmVzPDxlbmRsCiNkZWZpbmUgICAgZmFzdCBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApO2Npbi50aWUoMCk7Y291dC50aWUoMCkKI2RlZmluZSAgICBwZiAgICAgIHB1c2hfZnJvbnQKI2RlZmluZSAgICBwYiAgICAgIHB1c2hfYmFjawojZGVmaW5lICAgIE5MICAgICAgcHJpbnRmKCJcbiIpCiNkZWZpbmUgICAgWUVTICAgICAgIHByaW50ZigiWUVTXG4iKQojZGVmaW5lICAgIE5PICAgICAgICBwcmludGYoIk5PXG4iKQojZGVmaW5lICAgIFllcyAgICAgICBwcmludGYoIlllc1xuIikKI2RlZmluZSAgICBObyAgICAgICAgcHJpbnRmKCJOb1xuIikKI2RlZmluZSB0YyBpbnQgdGM7c2NhbmYoIiVkIiwmdGMpO2ZvcihpbnQgY3M9MTtjczw9dGM7Y3MrKykKCmNvbnN0IGxsIE49MWU2KzY7CmNvbnN0IGxsIG14bj0yZTUrNjsKY29uc3QgbGwgbW9kPTFlOSs3OwoKbGwgYXJhWzEwMDExXSAsIG4gOwpsbCBkcFsxMDAxMV1bMjU1MF07CgpsbCBGdW4obGwgaW5kICwgbGwgdmFsKQp7CiAgICBpZihpbmQ+bikKICAgIHsKICAgICAgICByZXR1cm4gdmFsPT0wID8gMTowIDsKICAgIH0KICAgIGlmKGRwW2luZF1bdmFsXSE9LTEpIHJldHVybiBkcFtpbmRdW3ZhbF0gJW1vZCA7CgogICAgbGwgYW5zID0gMCA7CgogICAgYW5zKz0oRnVuKGluZCsxICwgdmFsICkpOyBhbnMlPW1vZDsKICAgIGFucys9KEZ1bihpbmQrMSAsICh2YWwqYXJhW2luZF0pJTI1MjApICk7YW5zJT1tb2Q7CiAgICByZXR1cm4gZHBbaW5kXVt2YWxdID0gYW5zIDsKfQoKaW50IG1haW4oICkKewoKICAgLy8gdGMKCiAgICB7CiAgICAgICAgbWVtc2V0KGRwICwgLTEgLCBzaXplb2YoZHApKTsKICAgICAgICBjaW4+Pm4gOwogICAgICAgIGZvcihsbCBpPTEgOyBpPD1uIDsgaSsrKSBjaW4+PmFyYVtpXSA7CiAgICAgICAgY291dDw8RnVuKDEsMSklbW9kPDxlbmRsOwogICAgfQoKICAgIHJldHVybiAwOwp9Ci8vcHJpbnRmKCJDYXNlICVkOiAiLGNzKTsK