Pagini recente » Cod sursa (job #341202) | Cod sursa (job #947794) | Cod sursa (job #65212) | Cod sursa (job #660610) | Cod sursa (job #67059)
Cod sursa(job #67059)
#include <stdio.h>
#include <string.h>
int prime[78498];
int nrPrime = 0;
int citeste() {
FILE *fin = fopen("fractii.in", "r");
int n;
fscanf(fin, "%d", &n);
fclose(fin);
return n;
}
void genPrime(int n) {
char p[1000001];
memset(p, 1, sizeof(char) * (n + 1));
p[1] = 0;
// printf("{2");
int i = 2;
for (; i <= n; ++i)
if (p[i]) {
// printf(", %d", i);
prime[nrPrime] = i;
++nrPrime;
int j = i * 2;
while (j <= n) {
p[j] = 0;
j += i;
}
}
// printf("}\n");
// printf("Total: %d numere prime\n", nrPrime);
}
int phi(int n) {
double rez = n;
// printf("Calculeaz phi(%d)...\n", n);
int i = 0;
while ((i < nrPrime) && (prime[i] <= n)) {
// printf("Verific daca este divizibil cu %d\n", prime[i]);
if (n % prime[i] == 0) {
rez *= (double)(prime[i] - 1) / (double)prime[i];
// printf("%g\n", (double)(prime[i] - 1) / (double)prime[i]);
}
++i;
}
return rez;
}
void scrie(double rez) {
FILE *fout = fopen("fractii.out", "w");
fprintf(fout, "%.0f\n", rez);
// printf("%.0f\n", rez);
fclose(fout);
}
int main(int argc, char *argv[]) {
int n = citeste();
genPrime(n);
float dejaCalculat[1000001];
int i = 2;
for (; i <= n; ++i)
dejaCalculat[i] = 0;
i = 2;
float rez = 1;
for (; i <= n; ++i) {
// printf("%d\n", i);
if (!dejaCalculat[i]) {
dejaCalculat[i] = phi(i);
// printf("phi(%d) = %.0f\n", i, dejaCalculat[i]);
int j = 2;
for (; (j <= i) && (i * j <= n); ++j) {
if (j == i)
dejaCalculat[i * j] = dejaCalculat[j] * j;
else
dejaCalculat[i * j] = dejaCalculat[i] * dejaCalculat[j];
// printf("phi(%d) = %.0f\n", i * j, dejaCalculat[i * j]);
}
}
rez += dejaCalculat[i] * 2;
}
scrie(rez);
return 0;
}