Pagini recente » Cod sursa (job #2696301) | Cod sursa (job #1190573) | Cod sursa (job #1783002) | Cod sursa (job #2566877) | Cod sursa (job #390457)
Cod sursa(job #390457)
#include <stdio.h>
#include <string.h>
#define MAX 1000002
char CIUR[MAX];
int t[MAX];
long long tot(int i)
{
if (t[i])
return t[i];
if (CIUR[i] == 0)
{
t[i] = i-1;
return i-1;
}
for (int k = 2; k <= i/2; k++)
{
if (CIUR[k] == 0 && i % k == 0)
{
int p = k;
while (i % p == 0)
{
p *= k;
}
p /= k;
int a = i / p;
t[i] = t[p]*t[a];
break;
}
}
return t[i];
}
int main()
{
FILE* fin = fopen("fractii.in", "r");
FILE* fout = fopen("fractii.out", "w");
int N;
fscanf(fin, "%d", &N);
memset(CIUR, 0, (N+1)*sizeof(char));
int limi = N+1;
for (int i = 2; i <= limi; i++)
{
if (CIUR[i] == 0)
{
int limj = limi / i + 1;
for (int j = 2; j < limj; j++)
{
CIUR[i*j] = 1;
}
if (i <= 1000)
{
long p = i*i;
while (p <= N)
{
t[p] = (i-1)*p/i;
p *= i;
}
}
}
}
long long nr = 1;
for (int i = 2; i <= N; i++)
{
nr += 2*tot(i);
}
fprintf(fout, "%lld", nr);
fclose(fin);
fclose(fout);
return 0;
}