Pagini recente » Cod sursa (job #960396) | Cod sursa (job #232428) | Cod sursa (job #229861) | Cod sursa (job #2709277) | Cod sursa (job #953351)
Cod sursa(job #953351)
#include <fstream>
using namespace std;
ifstream fin("fractii.in");
ofstream fout("fractii.out");
bool v[1000001]; // 0 if prime, 1 if composite
//Problema cere in fond toate perechile de numere i,j <= N cu i,j prime intre ele. Folosim deci indicatorul lui Euler
//si, pentru mai multa rapiditate, ciurul lui eratostene pentru a gasi numerele prime (indicatorul lui euler pentru n prim este automat n-1)
void erathostenes (int n)
{
for (int i=4;i<=n;i=i+2) v[i]=1;
for (int i=3;i*i<=n;i=i+2)
{
if (v[i]) continue;
for (int j=i; j*i<=n; j++) v[j*i]=1;
}
}
int euler_totient (int x)
{
int i,factor[1001],nr=0;
int temp=x;
for (i=2; temp>1 ;i++)
{
if (temp%i) continue;
while (temp%i==0)
{
temp=temp/i;
}
factor[++nr]=i;
}
int totient=1;
for (i=1;i<=nr;i++) //cale rapida de calculare a indicatorului, nu cred ca e nevoie sa ne complicam cu floaturi
{
x=x/factor[i];
totient=totient*(factor[i]-1);
}
return totient*x;
}
int main()
{
int n; long long f=0;
fin>>n;
erathostenes (n);
for (int i=2; i<=n; i++)
{
if (!v[i]) f=f+i-1;
else f=f+euler_totient (i);
}
f=f*2; f++; //pentru o fractie x/y ireductibila, exista si fracti y/x ireductibila. De asemenea sa nu uitam de 1/1
fout<<f;
}