Pagini recente » Cod sursa (job #1260329) | Cod sursa (job #1619008) | Cod sursa (job #1815004) | Cod sursa (job #2185892) | Cod sursa (job #595829)
Cod sursa(job #595829)
#include <fstream>
#include <math.h>
using namespace std;
struct s_factor
{
int d; //baza
int p; //puterea
};
int n,total;
bool ciur[1000001];
int nfact;
s_factor fact[20];
void create_ciur();
int euler(int k);
int main()
{
ifstream in("fractii.in");
ofstream out("fractii.out");
int i1;
in>>n;
create_ciur();
//luam fiecare numar 2<=x<=n si calculam func. euler pt acesta, adunand la total
for(i1=2;i1<=n;i1++)
total += euler(i1);
total = total*2 + 1;
out<<total;
in.close();
out.close();
return 0;
}
void create_ciur()
{
int i1,i2;
for(i1=2;i1<=n;i1++)
for(i2=2;i1*i2<=n;i2++)
ciur[i1*i2] = true;
}
int euler(int k)
{
int i1,div,p=1;
//daca k numar prim
if(!ciur[k])
p = k-1;
else
{
//descompunere in factori
nfact = 0;
div = 2;
while(k>1)
{
while(ciur[div]) //gasire div prim
div++;
if(!(k%div)) //daca se divide
{
fact[nfact].d = div;
fact[nfact].p = 0;
while(!(k%div)) //cat timp se divide
{
fact[nfact].p++;
k = k/div;
}
nfact++;
}
div++; //trecerea la un div superior
}
//functia euler
for(i1=0;i1<nfact;i1++)
p *= (fact[i1].d-1) * (int)pow(fact[i1].d, fact[i1].p-1);
}
return p;
}