Cod sursa(job #65263)

Utilizator eddieOlariu Eduard Iuliu eddie Data 8 iunie 2007 08:57:42
Problema Fractii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <stdio.h>
#include <math.h>
long n;
long k;
long long prim[1000000];
int x[100],nx;
void adunare(long long a)
 {
  register long long i=1;
  long long h=a+x[1];
  x[1]=h%10;
  long long t=h/10;
  while (t!=0)
   {
    i++;
    if (i>nx)
       nx++;
    h=t+x[i];
    x[i]=h%10;
    t=h/10;
   }
 }
void ciur()
 {
  int p[10000000]={0};
  long i;
  prim[0]=2;
  for (i=3;i<=n;i+=2)
      {
       if (p[i]==0)
	  {
	   prim[++k]=i;
	   register long long j;
	   for (j=i*i;j<=n;j+=i)
	       p[j]=1;
	  }
      }
  prim[k+1]=10000000;
 }
long long teta(long n)
 {
 /* register long i;
  long long pl=n;
  int c=0;
  while (n%2==0)
   {
    n/=2;
    c=1;
   }
  if (c==1)
     pl=pl/2;
  long d=3;
  while (n!=1)
    {
     c=0;
     while (n%d==0)
	  {
	   n/=d;
	   c=1;
	  }
     if (c==1)
	pl=(pl/d)*(d-1);
     d+=2;
    }*/
  register long i;
  long long pl=n;
  for (i=0;prim[i]<=n;i++)
      if (n%prim[i]==0)
	 pl=(pl/prim[i])*(prim[i]-1);
  return pl;
 }
int main()
 {
  x[1]=1;
  freopen("fractii.in","r",stdin);
  freopen("fractii.out","w",stdout);
  scanf("%lld",&n);
  ciur();
  register long i;
  for (i=2;i<=n;i++)
     {
      adunare(2*teta(i));
     }
  for (i=nx;i>=1;i--)
      printf("%d",x[i]);
  fclose(stdout);
  return 0;
 }