Cod sursa(job #1459111)

Utilizator om6gaLungu Adrian om6ga Data 9 iulie 2015 04:05:49
Problema Fractii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

char a[1000005];
int prime[1000005];
long long t[1000005];

void ciur()
{
    int i, j;
    for (i = 2; i <= sqrt(1000000); i++){
        if (!a[i]){
            for (j = i*i; j <= 1000000; j += i)      
                a[j] = 1;      
        }
    }    
}

void prim()
{
    int i, j = 0;
    for (i = 2; i <= sqrt(1000000); i++)
        if (!a[i])
        {
            prime[j] = i; 
            j++;
        }
}

void print()
{
    int i;
    for (i = 0; i <= 20; i++)
        printf("prime[%d]=%d\n", i, prime[i]);    
}

void totem()
{
    int i, j, k, e;
    t[1]=t[2]=1;
    t[3]=2;
        
    for (i = 4; i <= 1000000; i++)
    {
        if (!a[i])
            t[i] = i-1;
        else
        {
            //for (j = 2; j <= sqrt(i); j++)
            j = 0;
            while(prime[j])
            {
               if (i == (i/prime[j])*prime[j])
               {
                   e = 1;
                   k = i/prime[j];
                   while (k == (k/prime[j])*prime[j])
                   {
                       k/=prime[j];
                       e*=prime[j];
                   }
                   t[i] = (prime[j] - 1)*e*t[k];
                   break;
               }
               j++;
            }
        }
    }
}

int main()
{
    int n, i;
    long long result = 1l;
    FILE *f=fopen("fractii.in","r");
    fscanf(f,"%d",&n);
 
    ciur();
    prim();
    totem();
    for (i = 2; i <= n; i++)
        result += 2*t[i];
 
    FILE *out=fopen("fractii.out","w");
    fprintf(out,"%lld", result);
    return 0;
}