Cod sursa(job #109820)

Utilizator adalLica Adela adal Data 25 noiembrie 2007 12:45:42
Problema Pairs Scor 20
Compilator cpp Status done
Runda preONI 2008, Runda 1, Clasa a 10-a Marime 2.01 kb
#include <cstdio>

FILE *ff=fopen("pairs.in","r");
FILE *g=fopen("pairs.out","w");

struct rec { long s,d; } b[30];
long k,m,f,x,i,j,q,l,n;
long a[100005],fr[1000000],sol[50];
long long sum1, sum;
void calc(long m)
{
   long i,j,nr; long long p;
   p=1;         nr=0;
   for (i=1; i<=m; i++) {
       for (j=1; j<=sol[i]; j++) {p*=b[i].s; nr++;}
   }
   if (nr!=0) ++fr[p];
}

void back1(long k)
{
   int i;
   if (k==m+1) {
      calc(m);
   }
   else
     for (i=0; i<=b[k].d; i++) {
       sol[k]=i;
       back1(k+1);
     }
}
void calc2(long m)
{
 long i,nr,x; long long p;
 p=1; nr=0;
 for (i=1; i<=m; i++)
   if (sol[i]==1) {p=p*b[i].s; nr++;}
 if (nr%2==0) x=-1; else x=1;
 sum1+=x*fr[p];
}
 
void back2(long k)
{
   int i;
   if (k==m+1) {
      calc2(m);
   }
   else
     for (i=0; i<=1; i++) {
       sol[k]=i;
       back2(k+1);
     }
}
 
int main()
{
    fscanf(ff,"%ld",&n);
    for(i=1; i<=n; i++){
       fscanf(ff,"%ld",&a[i]);
    }
    for (i=1; i<=n; i++) {
        x=a[i]; m=1; b[m].d=0;
        while(x%2==0 && x!=1) { x=x/2; b[m].s=2; b[m].d+=1; }
        if (b[m].s==0) --m;
        f=3;
        while (x!=1) {
           if (x%f==0) {
              ++m; b[m].s=f; b[m].d=1; x=x/f;
              while (x%f==0 && x!=1) {
                  x=x/f;  b[m].d+=1;
              }
            }
            f+=2;
            
        }
        for (l=1;l<=m+1; l++) sol[l]=0;
        back1(1);
   }
   sum=0;
   for (i=1; i<=n; i++) {
       x=a[i]; m=1; b[m].d=0;
        while(x%2==0 && x!=1) { x=x/2; b[m].s=2; b[m].d+=1; }
        if (b[m].d==0) --m;
        f=3;
        while (x!=1) {
           if (x%f==0) {
              ++m; b[m].s=f;  b[m].d=1;  x=x/f;
              while (x%f==0 && x!=1) {
                  x=x/f;  b[m].d+=1;
              }
             }
            f+=2;
            
        }
        sum+=n; sum1=0;
        back2(1);
        sum=sum-sum1;
   }
   fprintf(g,"%lld",sum/2);
   fclose(g); fclose(ff);
}