Cod sursa(job #2025)

Utilizator demonuTeodor Stoenescu demonu Data 15 decembrie 2006 18:07:13
Problema Fractii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.03 kb
#include <stdio.h>
#include <math.h>
#include <string.h>

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

int vec[1000010];
typedef int bignum[15];

void set(bignum b, int n) {
    memset(b, 0, sizeof(bignum));
    if (!n) {
        return;
    }
    while(n) {
        b[++b[0]] = n % 10;
        n /= 10;
    }
}

void mult(bignum b, int x) {
    int t = 0;
    for (int i = 1; i <= b[0]; ++i) {
        b[i] = b[i] * x + t;
        t = b[i] / 10;
        b[i] %= 10;
    }
    while (t) {
        b[++b[0]] = t % 10;
        t /= 10;
    }
}

void add(bignum b, bignum a) {
    int t = 0;
    if (a[0] > b[0]) {
        b[0] = a[0];
    }
    for (int i = 1; i <= b[0]; ++i) {
        b[i] += a[i] + t;
        t = b[i] / 10;
        b[i] %= 10;
    }
    if (t) {
        b[++b[0]] = t;
    }
}

void sub(bignum b, bignum a) {
    int t = 0;
    for(int i = 1; i <= b[0]; ++i) {
        if (a[i] + t > b[i]) {
            b[i] = (10 + b[i] - a[i] - t) % 10;
            t = 1;
        } else {
            b[i] -= a[i] + t;
            t = 0;
        }
    }
    while(!b[b[0]]) {
        b[0]--;
    }
}

void sum(int k, bignum rez) {
    set(rez, 0);
    for (int i = 2; i <= k; ++i) {
        if (vec[i] != -1) {
            int d = k / i;
            bignum g;
            set(g, d);
            mult(g, d);
            if(vec[i] > -1) {
                mult(g, vec[i] + 1);
                add(rez, g);
            } else {
                mult(g, -vec[i] - 1);
                sub(rez, g);
            }
            for (int j = 2 * i; j <= k; j += i) {
                vec[j] -= (vec[i] + 1);
            }
        }
    }
}

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

    f = fopen(fout, "wt");
    bignum nn, re;
    set(nn, n);
    mult(nn, n);
    sum(n, re);
    sub(nn, re);

    for(int i = nn[0]; i > 0; --i) {
        fprintf(f, "%d", nn[i]);
    }

    fclose(f);
    return 0;
}