Pagini recente » Cod sursa (job #843496) | Cod sursa (job #755425) | Cod sursa (job #1802731) | Cod sursa (job #1048150) | Cod sursa (job #2102369)
#include <cstdio>
#include <vector>
#include <iostream>
#define BAZA 1000000000
#define MAXN 1001
using namespace std;
typedef int HUGE[150];
bool ciur[MAXN];
vector <int> prime;
int v[500];
HUGE a[MAXN],one={1,1};
inline void inmult(HUGE a,HUGE b)
{
int t=0;
a[0]=max(a[0],b[0]);
for(int i=1;i<=a[0];i++)
{
a[i]=a[i]*b[i]+t;
t=a[i]/BAZA;a[i]%=BAZA;
}
while(t)
{
a[++a[0]]=t%BAZA;
t/=BAZA;
}
}
inline void adun(HUGE a,HUGE b,char semn)
{
int t=0;
a[0]=max(a[0],b[0]);
for(int i=1;i<=a[0];i++)
{
a[i]+=(b[i]+t)*semn;
t=a[i]/BAZA;a[i]%=BAZA;
}
if(t)
a[++a[0]]=t;
if(!a[a[0]])
a[0]--;
}
inline void lgput(HUGE a,int n)
{
HUGE b={1,2};
while(n)
{
if(n&1)
inmult(a,b);
inmult(b,b);
n>>=1;
}
}
int main()
{
FILE *fin,*fout;
fin=fopen("indep.in","r");
fout=fopen("indep.out","w");
int n,nr,lim,nrbit,prod,mask,maxim;
char semn;
for(int i=2;i*i<MAXN;i++)
for(int j=i*i;j<MAXN;j+=i)
ciur[j]=true;
for(int i=2;i<MAXN;i++)
if(!ciur[i])
prime.push_back(i);
fscanf(fin,"%d",&n);
for(int i=0;i<n;i++)
{
fscanf(fin,"%d",&v[i]);
maxim=max(maxim,v[i]);
}
lim=1<<prime.size();a[1][0]=a[1][1]=1;
lgput(a[1],n);adun(a[1],one,-1);
for(int i=1;i<lim;i++)
{
prod=mask=1;nr=0;
for(unsigned int j=0;j<prime.size();j++)
{
if(i&mask)
prod*=prime[j];
mask<<=1;
}
if(prod<=maxim)
{
for(int j=0;j<n;j++)
if(v[j]%prod==0)
nr++;
a[prod][0]=a[prod][1]=1;
lgput(a[prod],nr);
adun(a[prod],one,-1);
}
}
for(int i=1;i<lim;i++)
{
nrbit=0;prod=mask=1;
for(unsigned int j=0;j<prime.size();j++)
{
if(i&mask)
nrbit++,prod*=prime[j];
mask<<=1;
}
if(prod<=maxim)
{
if(nrbit&1)
semn=-1;
else
semn=1;
adun(a[1],a[prod],semn);
}
}
fprintf(fout,"%d",a[1][a[1][0]]);
for(int i=a[1][0]-1;i>0;i--)
fprintf(fout,"%.9d",a[1][i]);
fclose(fin);
fclose(fout);
return 0;
}