Cod sursa(job #1766639)

Utilizator dobrebogdanDobre Bogdan Mihai dobrebogdan Data 28 septembrie 2016 11:22:10
Problema Indep Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#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;
}