Cod sursa(job #262299)

Utilizator moonbeamElma Moonbeam moonbeam Data 19 februarie 2009 11:08:38
Problema Fractii Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.02 kb
#include<stdio.h>
#define N 1000001
char c[N];
long int n1,num,v[N],poz;
long int descompun(int n)
{
  float p=n;
  poz=0;
  for (int i=2; i*i<=n;++i)
  {
	int ok=0;
	while (n%i==0){n/=i; ok=1;}
	if (ok)  {p*=(float)(i-1)/i;v[++poz]=i;}
  }
  if (n>1) {p*=(float)(n-1)/n; v[++poz]=n;}
  long int s=p;
  //s=s+(n1-n);
  return s;
}
void ciur(int n)
{
  long int d=2;
  while (d*d<=n)
  {
    if (!c[d]) for (int i=d*d; i<=n; i+=d)c[i]=1;
    ++d;
  }
}
void caut(int n)
{
  for (int i=n+1; i<=n1; ++i)
  {
      int ok=1;
      for (int j=1; j<=poz; ++j)
      if(i%v[j]==0){ok=0; break;}
      if (ok) ++num;
  }
}
void citire()
{
  freopen("fractii.in","r",stdin);
  freopen("fractii.out","w",stdout);
  scanf("%ld",&n1);
  ciur (n1);
  num=n1;
  if (n1%2) num+=n1/2+1;
  else
  num+=n1/2;
  for (int i=3; i<=n1; ++i)
  {
     if (!c[i])
     num+=n1-(n1/i);
     else
     {
	num+=descompun (i);
	caut(i);
     }
  }
  printf("%ld",num);
}
int main()
{
	citire();
	return 0;
}