Cod sursa(job #157030)

Utilizator rethosPaicu Alexandru rethos Data 12 martie 2008 20:35:05
Problema Fractii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
#include <fstream.h>
#include <math.h>
#define NMAX 1000001
long baze[NMAX];
long long pow(long p,long e)
{ if (e==0) return 1;
  if (e%2) return p*pow(p*p,e/2);
  return pow(p*p,e/2);
}
/*long sqrt(long x)
{ long st=1,dr=x;
  long mij;
  while (st<=dr)
	{ mij=(st+dr)/2;
	  if (mij*mij<=x&&(mij+1)*(mij+1)>x) return mij;
	  if (mij*mij>x) dr=mij-1;
		else st=mij+1;
	}
  return 0;
} */
long prim(long x)
{ long i;
  long sx=(long)sqrt(x);
  for (i=2;i<=sx;i++)
	if (x%i==0) return i;
  return x;
}
int main()
{ long n,i,j,t[NMAX],x,p,e,a,c;
  long long nr;
  ifstream f("fractii.in");
  f>>n;
  f.close();
  nr=1;
  t[1]=1;
  for (i=2;i<=n;i++)
	{ x=prim(i);
	  if (x==i) p=i;
	      else p=baze[x];
	  baze[i]=p;
	  if (p==i) e=1;
		else { a=i;e=0;
		       while (a%p==0)
			{ e++;
			  a=a/p;
			}
		     }
	  c=pow(p,e-1);
	  a=i/(c*p);
	  t[i]=(p-1)*c*t[a];
	  nr+=2*t[i];
	}
  ofstream g("fractii.out");
  g<<nr;
  g.close();
  return 0;
}