Cod sursa(job #173493)

Utilizator razvanelu99Razvan Andrus razvanelu99 Data 7 aprilie 2008 19:58:10
Problema Fractii Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.93 kb
#include<stdio.h>
#include<math.h>
int v[1000010];
long prim[100000],tot[1000010];
int main()
{
FILE *f,*g;
f=fopen("fractii.in","r");
g=fopen("fractii.out","w");
//ifstream f("fractii.in");
//ofstream g("fractii.out");
long n,l=0,k,e,a,i;
long long j;
fscanf(f,"%ld ",&n);

for (i=4;i<=n;i+=2) v[i]=1;
for (i=3;i<=n;i+=2)
   {
   v[i-1]=1;
   if (v[i]==0)
     {
     for (j=i*i;j<=n;j+=i)  v[j]=1;
     }
   }
if (n%2==0) v[n]=1;
v[2]=0;
for (i=2;i<=n;i++) if (v[i]==0) prim[++l]=i;
tot[1]=1;
for (i=2;i<=n;i++)
   {
   if (!v[i]) tot[i]=i-1;
   else
      {
      for (j=1;j<=l;j++)
	 {
	 if (i%prim[j]==0)
	   {
	   k=prim[j];
	   a=i;
	   e=0;
	   while (a%k==0)
		{
		e++;
		a/=k;
		}
	   break;
	   }
	 }
      tot[i]=(k-1)*(i/(a*k))*tot[a];
      }
   }
long long s=0;
for (i=2;i<=n;i++) s+=tot[i];
s=s*2+1;
fprintf(g,"%lld\n",s);
//fprintf(g,"\n");
fclose(f);
fclose(g);
return 0;
}