Cod sursa(job #80160)

Utilizator alex23alexandru andronache alex23 Data 26 august 2007 17:30:23
Problema Fractii Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.03 kb
#include <stdio.h>


int v[1000],w[1000],a[1000],n,nr,p[1000000],i,j,k,x,suma,s,r,q;

void prim(int n)

 {int i,j;
  for (i=1;((i*i)<<1)+(i<<1)<=n;i+=1)
     {if ((p[i>>3]&(1<<(i&7)))==0)
              {for (j=((i*i)<<1)+(i<<1);(j<<1)+1<=n;j+=(i<<1)+1)
                           {p[j>>3]|=(1<<(j&7));
                            }
               }
       }
  //for (i=1;2*i+1<=n;++i)
    //     if ((p[i>>3]&(1<<(i&7)))==0) nr++;
  //return nr;
  }


int main()
{FILE *fin,*fout;

 fin=fopen("fractii.in","r");
 fscanf(fin,"%d",&n);
 fclose(fin);
 prim(n);
 nr=n;
 if (n>1) nr=nr+n-n/2;
 for (i=3;i<=n;i++)
    {x=(i-1)/2;
     if ((i%2==1)&&((p[x>>3]&(1<<(x&7)))==0)) nr=nr+n-n/i;
                else {k=0;suma=0;
                      if (i%2==0) {k++;a[k]=2;}
                      for (j=3;j<=i/2;j=j+2)
                           {x=(j-1)/2;
                            if (((p[x>>3]&(1<<(x&7)))==0)&&(i%j==0))  {k++;a[k]=j;}
                            }
                      v[k]=1;
                      for (j=0;j<=k-1;j++) v[j]=0;
                      for (j=1;j<=k;j++) w[j]=0;
                      s=0;r=1;
                      while (v[0]==0)
                          {for (j=1;j<=k;j++)
                             if (w[j]!=(v[j-1]+v[j])%2)
                                       {w[j]=(v[j-1]+v[j])%2;
                                        q=j;
                                        j=k+1;
                                        }
                           if (w[q]==0) {s--;r=r/a[q];}
                                   else {s++;r=r*a[q];}
                           if (s%2==1) suma=suma+n/r;
                                  else suma=suma-n/r;
                            v[k]++;
                            j=k;
                            while (v[j]==2) {v[j]=0;j--;v[j]++;}
                           }
                      nr=nr+n-suma;
                      }
      }

  fout=fopen("fractii.out","w");
  fprintf(fout,"%d",nr);
  fclose(fout);

  return 0;

 }