Cod sursa(job #195578)

Utilizator marinMari n marin Data 19 iunie 2008 19:48:55
Problema Indep Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.33 kb
#include <stdio.h>
#define BASE 10
#define DIM 502


int p[170]={1,
	2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71,
	73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173,
	179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281,
	283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409,
	419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541,
	547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659,
	661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809,
	811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941,
	947, 953, 967, 971, 977, 983, 991, 997, 1001};


int n,i,j,k,max,pMax,card,u,pp;

int v[1002];
int c[1002];
int d[1002];

int sumM[DIM], sumP[DIM],unu[DIM],n2[DIM];

int doi[DIM][DIM];


void AtribValue(int* H, unsigned long X) {
  H[0] = 0;
   while (X) {
       ++H[0];  
       H[H[0]] = X % BASE;  
       X /= BASE;  
   }  
 }  

 void AtribHuge(int* H, int* X) {
   int i;
   for (i = 0; i <= X[0]; ++i) {
     H[i] = X[i];  
   }  
 }


 void Add(int* A, int* B)
    /* A <- A+B */  
    { int i,T=0;  
      
      if (B[0]>A[0])  
        { for (i=A[0]+1;i<=B[0];) A[i++]=0;  
	  A[0]=B[0];
	}
	else for (i=B[0]+1;i<=A[0];) B[i++]=0;
     for (i=1;i<=A[0];i++)
       { A[i]+=B[i]+T;
	 T=A[i]/10;
	 A[i]%=10;
       }
     if (T) A[++A[0]]=T;
   }

 void Subtract(int* A, int* B)
 /* A <- A-B */
 { int i, T=0;
   for (i=B[0]+1;i<=A[0];) B[i++]=0;
   for (i=1;i<=A[0];i++)
     A[i]+= (T=(A[i]-=B[i]+T)<0) ? 10 : 0;
     /* Adica A[i]=A[i]-(B[i]+T);
	if (A[i]<0) T=1; else T=0;
	if (T) A[i]+=10; */
   while (!A[A[0]]) A[0]--;
 }

 void Mult(int* H, unsigned long X)
 /* H <- H*X */
 { int i;
   unsigned long T=0;
   for (i=1;i<=H[0];i++)
     { H[i]=H[i]*X+T;
       T=H[i]/10;
       H[i]=H[i]%10;
     }
   while (T) /* Cat timp exista transport */
     { H[++H[0]]=T%10;
       T/=10;
     }
 }



int main(){
  FILE *f = fopen("indep.in","r");
  fscanf(f,"%d",&n);
  for (i=1;i<=n;i++) {
    fscanf(f,"%d",&v[i]);
    if (v[i]>max) max = v[i];
  }

  fclose(f);

  for (i=1;i<=169;i++)
    if (p[i]>max) break;

  pMax = i-1;


  AtribValue(doi[0],1);
  AtribValue(unu,1);

  for (i=1;i<=n;i++) {
    AtribHuge(doi[i],doi[i-1]);
    Mult(doi[i],2);
  }


  AtribValue(sumM,0);
  AtribValue(sumP,0);


  c[1]=1;
  d[1]=0;
  u=1;
  for (i=1;i<=pMax;i++) {

    pp=u;




    for (j=1;j<=pp;j++) {
      if (c[j]*p[i]<=max) {
	u++;
	c[u]=c[j]*p[i];
	d[u]=d[j]+1;

	card=0;
	  for (k=1;k<=n;k++)
	    if (v[k]%c[u]==0)
	      card++;
//	n2=(1<<card)-1;
	AtribHuge(n2,doi[card]);
	Subtract(n2,unu);
	if (d[u]%2==1){
	  Add(sumM,n2);
//	  sum=sum-n2;
	} else {
//	  sum+=n2;
	  Add(sumP,n2);
	}
      }
    }


  }

  AtribHuge(n2,doi[n]);
  Subtract(n2,unu);
  Add(sumP,n2);
  Subtract(sumP,sumM);

//  sum+=((1<<n)-1);

  FILE *g = fopen("indep.out","w");
  for (i=sumP[0];i>=1;i--)
    fprintf(g,"%d",sumP[i]);
  if (sumP[0]<0) fprintf(f,"%d",0);
  fclose(g);

  return 0;
}