Pagini recente » Cod sursa (job #2215469) | Cod sursa (job #1346165) | Cod sursa (job #686386) | Cod sursa (job #1051007) | Cod sursa (job #1766639)
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
using namespace std;
const int nmax=500,vmax=1000,lmax=1000000;
const long long md=1000000007;
int n,npr,in[nmax+5],ci[nmax+5],pr[nmax+5],lh;
long long ans,has[lmax+5],p2[vmax+5];
bool be[nmax+5];
vector<int> di[nmax+5],ap[nmax+5];
map<long long,int> mp;
void ciur()
{
npr++;
pr[npr]=2;
for(int i=3;i<=n;i=i+2)
if(ci[i]==0)
{
npr++;
pr[npr]=i;
for(int j=i*i;j<=n;j=j+2*i)
ci[j]=1;
}
}
void bck(int p,int l,int r,int x,long long hs)
{
if(l<r)
{
hs=hs+p2[di[p][l]];
if(hs>=md)
hs=hs-md;
bck(p,l+1,r,1-x,hs);
hs=hs-p2[di[p][l]];
if(hs<0)
hs+=md;
bck(p,l+1,r,x,hs);
}
else
{
if(mp[hs]==0)
{
lh++;
has[lh]=hs;
}
// if(hs!=0)
// cout<<hs<<" "<<x<<"\n";
if(x==0)
mp[hs]--;
else
mp[hs]++;
}
}
void calc(int p)
{
bck(p,0,di[p].size(),0,0);
}
int main()
{
freopen("indep.in","r",stdin);
freopen("indep.out","w",stdout);
int m,i,j;
long long ans=0;
p2[0]=1;
for(i=1;i<=vmax;i++)
{
p2[i]=p2[i-1]*2;
if(p2[i]>=md)
p2[i]-=md;
}
cin>>n;
for(i=1;i<=n;i++)
cin>>in[i];
ciur();
for(i=1;i<=n;i++)
for(j=1;j<=npr;j++)
if(in[i]%pr[j]==0)
{
di[i].push_back(j);
ap[j].push_back(i);
}
for(i=1;i<=n;i++)
calc(i);
ans=0;
// cout<<lh<<"\n";
for(i=1;i<=lh;i++)
if(has[i]!=0)
{
if(mp[has[i]]>0)
ans=ans+((1<<(mp[has[i]])));
else
ans=ans-((1<<(-mp[has[i]])));
// cout<<ans<<"\n";
}
cout<<p2[n]-ans<<"\n";
return 0;
}