Pagini recente » Cod sursa (job #2557426) | Cod sursa (job #647028) | Cod sursa (job #1590551) | Cod sursa (job #869704) | Cod sursa (job #3219536)
#include <fstream>
using namespace std;
ifstream fin ("indep.in");
ofstream fout ("indep.out");
int maxim,n,m,x,v[501],i,j,ok,d,nr,nrc,p[501][155],val[155],sol1[155],sol2[155],sol[155];
void adunare (int c[],int a[],int b[])
{
int t=0,i=0;
for (i=1; i<=a[0]||i<=b[0]; i++)
{
c[i]=a[i]+b[i]+t;
t=c[i]/10;
c[i]=c[i]%10;
}
c[0]=i-1;
if (t>0)
{
c[0]=i;
c[i]=t;
}
}
void scadere (int c[],int a[],int b[])
{
int t=0,i=0;
for (i=1; i<=a[0]; i++)
{
if (a[i]-t<b[i])
{
c[i]=10+a[i]-b[i]-t;
t=1;
}
else
{
c[i]=a[i]-b[i]-t;
t=0;
}
}
c[0]=a[0];
while (c[0]>1&&c[c[0]]==0)
c[0]--;
}
void copiere (int a[],int b[])
{
for (int i=1; i<=a[0]; i++)
a[i]=0;
a[0]=0;
for (int i=0; i<=b[0]; i++)
a[i]=b[i];
for (int i=1; i<=b[0]; i++)
b[i]=0;
b[0]=0;
}
int main ()
{
fin>>n;
p[0][0]=p[0][1]=1;
for (i=1; i<=n; i++)
adunare (p[i],p[i-1],p[i-1]);
for (i=1; i<=n; i++)
p[i][1]--;
for (i=1; i<=n; i++)
{
fin>>v[i];
maxim=max (maxim,v[i]);
}
for (i=2; i<=maxim; i++)
{
x=i;
ok=1;
nrc=0;
for (d=2; d*d<=x; d++)
{
if (x%d==0)
{
nr=0;
while (x%d==0)
{
nr++;
x/=d;
}
if (nr>1)
{
ok=0;
break;
}
nrc++;
}
}
if (x!=1)
nrc++;
if (ok==1)
{
m=0;
for (j=1; j<=n; j++)
m+=(v[j]%i==0);
if (m!=0)
{
if (nrc%2!=0)
{
adunare (val,sol1,p[m]);
copiere (sol1,val);
}
else
{
adunare (val,sol2,p[m]);
copiere (sol2,val);
}
}
}
}
scadere (val,sol1,sol2);
copiere (sol,val);
scadere (val,p[n],sol);
for (i=val[0]; i>0; i--)
fout<<val[i];
return 0;
}