Cod sursa(job #187812)

Utilizator cotofanaCotofana Cristian cotofana Data 5 mai 2008 15:56:40
Problema Fractii Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.32 kb
#include <stdio.h>
//#define er(i) (ch[i/8])&(1<<(i%8))

char ch[1000000];
int n, nr;

void cit()
{
        FILE *f=fopen("fractii.in", "r");
        fscanf(f, "%d", &n);
        fclose(f);
}

void tip()
{
        FILE *f=fopen("fractii.out", "w");
        fprintf(f, "%d\n", nr);
        fclose(f);
}

/*int ver()
{
        int i;
        for (i=1; i<=n; i++)
                //if (er(i)&1==0) return 0;
                if (ch[i]==0) return 0;
        return 1;
} */

int prim(int nr)
{
        int i;
        if (nr%2==0) return 0;
        for (i=3; i<=nr/2; i+=2)
                if (nr%i==0) return 0;
        return 1;
}

/*void set_er(int i)
{
        ch[i/8]|=1<<(i%8);
} */

void eratos()
{
        int i, j, t, num, k, j1;
        i=2;
        while (i<=n)
        {
        for (j1=1; j1<=n/i; j1++)
        {
                j=j1;
                //if (er(i*j)&1) continue;
                if (ch[i*j]) continue;
                num=1;
                //set_er(i*j);
                ch[i*j]=1;
                if (j%i==0)
                {
                        t=1;
                        while (j%i==0)
                        {
                                t*=i;
                                j/=i;
                        }
                        num*=t;
                }
                if (j%i && j!=1)
                {
                        for (k=i+1; k<=j; k++)
                        {
                                t=1;
                                if (j%k==0)
                                        if (prim(k))
                                                while (j%k==0)
                                                {
                                                        t*=k;
                                                        j/=k;
                                                }
                                num*=t-t/k;
                        }
                }
                if (j==1) num*=i-1;
                nr+=2*num;
        }
        if (i==2) i++;
        else
                do
                {
                        i+=2;
                } while (!prim(i));
        //nr+=2*num;
        }
        nr+=1;
}

int main()
{
        cit();
        eratos();
        tip();
        return 0;
}