Pagini recente » Cod sursa (job #2383481) | Cod sursa (job #301915) | Cod sursa (job #810264) | Cod sursa (job #998371) | Cod sursa (job #629956)
Cod sursa(job #629956)
#include<stdio.h>
#define maxn 505
FILE*f=fopen("indep.in","r");
FILE*g=fopen("indep.out","w");
int n,i,maxval,j;
int A[maxn],ciur[maxn<<1],Ap[maxn<<1],nd[maxn<<1];
struct huge{
int n;
int v[1000];
huge () {
n = 0;
for ( int i = 0 ; i < 1000 ; ++i ){
v[i] = 0;
}
}
}P[1001],nrs;
inline huge adunare ( huge a , huge b ){
huge r; int i,T = 0;
r.n = a.n > b.n ? a.n : b.n;
for ( i = 1 ; i <= r.n ; ++i ){
r.v[i] = a.v[i] + b.v[i] + T;
T = r.v[i] / 10;
r.v[i] %= 10;
}
if ( T ){
r.v[++r.n] = 1;
}
return r;
}
inline huge scadere ( huge a , huge b ){
huge r; int i,T = 0;
r.n = a.n;
for ( i = 1 ; i <= a.n ; ++i ){
r.v[i] = a.v[i] - b.v[i] - T;
if ( r.v[i] < 0 ){
r.v[i] += 10; T = 1;
}
else{
T = 0;
}
}
while ( !r.v[r.n] && r.n > 1 ) --r.n;
return r;
}
int main () {
fscanf(f,"%d",&n);
for ( i = 1 ; i <= n ; ++i ){
fscanf(f,"%d",&A[i]); ++Ap[A[i]];
if ( A[i] > maxval ) maxval = A[i];
}
ciur[1] = 1;
for ( i = 2 ; i <= maxval ; ++i ){
if ( !ciur[i] ){
ciur[i] = 1;
for ( j = i + i ; j <= maxval ; j += i ){
if ( !(j % (i*i)) ){
ciur[j] = -1;
}
if ( ciur[j] != -1 ){
++ciur[j];
}
}
}
}
for ( i = 1 ; i <= maxval ; ++i ){
for ( j = i ; j <= maxval ; j += i ){
if ( Ap[j] )
nd[i] += Ap[j];
}
}
P[0].n = P[0].v[1] = 1;
for ( i = 1 ; i <= 1000 ; ++i ){
P[i] = adunare(P[i-1],P[i-1]);
}
nrs = scadere(P[n],P[0]);
for ( i = 2 ; i <= maxval ; ++i ){
if ( ciur[i] > 0 ){
if ( !(ciur[i] & 1) ){
nrs = adunare(nrs,scadere(P[nd[i]],P[0]));
}
}
}
for ( i = 2 ; i <= maxval ; ++i ){
if ( ciur[i] > 0 ){
if ( ciur[i] & 1 ){
nrs = scadere(nrs,scadere(P[nd[i]],P[0]));
}
}
}
for ( i = nrs.n ; i >= 1 ; --i ){
fprintf(g,"%d",nrs.v[i]);
}
fclose(f);
fclose(g);
return 0;
}