Cod sursa(job #1993)

Utilizator demonuTeodor Stoenescu demonu Data 15 decembrie 2006 16:27:45
Problema Fractii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <stdio.h>

const char *fin = "fractii.in";
const char *fout = "fractii.out";

int vec[1000010];
int prims[100000];
int primcount = 0;
int n = 0;

int divs(int c) {
    if (vec[c] == 0) {
        prims[primcount++] = c;
        if (primcount == 100000) printf("Hatz");
        for(int i = 2; i * c <= n; ++i) {
            vec[i * c] += i - 1;
        }
        vec[c] = c - 1;
        return c - 1;
    }
    int l = c, r = 1;
    for (int i = 0; (i < primcount) && (l > prims[i]); ++i) {
        while (l % (prims[i] * prims[i]) == 0) {
            r *= prims[i];
            l /= prims[i];
        }
    }
    if (r == 1) {
        vec[c] = c - 1 - vec[c];
        return vec[c];
    }
    vec[c] = r * vec[l];
    return vec[c];
}

int main(){
    FILE *f = fopen(fin, "rt");
    fscanf(f, "%d", &n);
    fclose(f);

    int r = 0;
    for (int i = 2; i <= n; ++i) {
        int d = divs(i);
        //printf("%d ", d);
        r += d;
    }

    f = fopen(fout, "wt");
    fprintf(f, "%d", (r << 1) + 1);
    fclose(f);
    return 0;
}