Cod sursa(job #744290)

Utilizator cipriancxFMI - gr143 Timofte Ciprian cipriancx Data 8 mai 2012 11:36:00
Problema Fractii Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include<iostream>
#include<cstdio>
#include<math.h>


using namespace std;

long int n,dim,fractii;
long int a[10000001];
long int nrprime[100001];


int coef(int div, int nr)
{

int aux=1;

nr=nr/div;
while(nr%div==0)
{ aux++; nr=nr/div;  }

return aux;

}


long int euler(long int nr)
{

if(nr%2==0){ if((nr>>1)%2==0) return 2*euler(nr>>1); return euler(nr>>1); }
long int i;


long int sum=1;
for(i=1; i<dim && nrprime[i]<=nr ; i++)
{
if(nr%nrprime[i]==0)  {

long int aux=nrprime[i];
long int putere=pow(aux,coef(aux,nr)-1);
sum=sum*(aux-1)*putere;
nr=nr/(putere*aux);

                 }
}


return sum;

}




int main(void)
{

freopen("fractii.in","r",stdin);
freopen("fractii.out","w", stdout);



cin>>n;

long int i,k;
dim=1;

for(i=2; i<=n; i++)
{
if(a[i]==0)  {
                    a[i]=1;
                   nrprime[dim]=i;
                  for(k=i; k<=n; k+=i)a[k]=1;
                     dim++;
                 }
}


long int j;


for(j=n; j>=2; j--)
{

fractii+=euler(j);
}

cout<<2*fractii+1;



return 0;
}