Cod sursa(job #2114446)

Utilizator andreinichitaTirziu Nichita andreinichita Data 25 ianuarie 2018 16:37:59
Problema Fractii Scor 0
Compilator cpp Status done
Runda ichb_10 Marime 1.79 kb
#include <cstdio>

using namespace std;
int fi[1010];
bool coprim(int a,int b)
{
    int r,aux;
    if(b>a)
    {
        aux=a;
        a=b;
        b=aux;
    }
    while(b)
    {
        r=a%b;
        a=b;
        b=r;
    }
    if(a==1)
        return 1;
    return 0;
}
bool isprime(int k)
{
    if(k==1||k==4)
        return 0;
    if(k==2||k==3||k==5)
        return 1;
    if(k%2==0)
        return 0;
    int d;
    for(d=3; d*d<=k; d+=2)
        if(k%d==0)
            return 0;
    return 1;
}
void phi()
{
    int i,j;
    fi[2]=1;
    fi[3]=2;
    fi[4]=2;
    for(i=5; i<=1005; i++)
    {
        if(isprime(i))
            fi[i]=i-1;
        else
        {
            fi[i]=1;
            for(j=2; j<=i; j++)
                if(coprim(i,j))
                    fi[i]++;
        }
    }
}
int putere(int a,int b)
{
    int prod=1,i;
    for(i=1; i<=b-1; i++)
        prod*=a;
    return prod*(a-1);
}
int putere1(int a,int b)
{
    int prod=1,i;
    for(i=1; i<=b; i++)
        prod*=a;
    return prod;
}
int rasp(int k)
{
    if(k<=1001)
        return fi[k];
    int d,put=0,x;
    for(d=2; d*d<=k; d++)
        if(k%d==0)
        {
            if(isprime(d))
                while(k%d==0)
                {
                    put++;
                    k/=d;
                }
            if(put==1||put==0)
                return rasp(d)*rasp(k/d);
            x=putere1(d,put);
            return putere(d,put)*rasp(k);
        }

}
int main()
{
    freopen("fractii.in","r",stdin);
    freopen("fractii.out","w",stdout);
    int n,i;
    long long sum=0;
    scanf("%d",&n);
    phi();
    for(i=n; i>=2; i--)
        sum+=2*rasp(i);
    //printf("%lld",sum+1);
    printf("%d",rasp(200200));
    return 0;
}