Cod sursa(job #496612)

Utilizator costyv87Vlad Costin costyv87 Data 29 octombrie 2010 22:57:21
Problema Fractii Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <stdio.h>
#include <math.h>
int n,nr,ss,x;
char p[100000];
int prim[100000];
int fprim[30];

void ciur(long long A)
{
long long i2,i, j;

for (i = 3; i <= A; i += 2) {
    if (p[i >> 4] & (1 << ((i >> 1) & 7))) continue;

    for (j = i + (i2 = i + i); j <= A; j += i2)
            p[j >> 4] |= 1 << ((j >> 1) & 7);
        }
nr=1;
prim[nr]=2;
for (i = 1; 2 * i + 1 <= A; ++i)
    if ((p[i >> 3] & (1 << (i & 7))) == 0)
        prim[++nr]=i*2+1;

}

void solve(int b) {
long long t=0,d=0;
while (b>1) {
    d++;
    if (b%prim[d] == 0) {
        fprim[++t]=prim[d];
        while (b % prim[d] == 0)
                b=b/prim[d];
        }

    if (prim[d]>sqrt(b) && b>1 ) {
        fprim[++t]=b;
        b=1;
        }
}

int i,j;
long sol=n;
for (i=1;i<(1<<t);i++) {
long long sm=0,prod=1;
for (j=0;j<t;j++)
        if ((1<<j) & i) {
        prod=1LL*prod*fprim[j+1];
        sm++;
        }
        if (sm%2==0) sm=1;
                else sm=-1;
        sol=sol+1LL*sm*n/prod;
}


ss+=sol;
}

int main() {
FILE *f,*g;
f=fopen("fractii.in","r");
g=fopen("fractii.out","w");
fscanf(f,"%d",&n);
ciur(1001000);
ss=n; int i;
for (i=2;i<=n;i++)
{
x=i;
solve(x);
}
fprintf(g,"%d",ss);
fclose(g);
return 0;
}