Cod sursa(job #1075280)

Utilizator alexalghisiAlghisi Alessandro Paolo alexalghisi Data 8 ianuarie 2014 20:00:13
Problema Fractii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 kb
#include <iostream>
#include <fstream>
#include <bitset>

#define DN 1000005
using namespace std;

int dv[DN],n;
long long s, fi[DN];
bitset<DN> prim;

void ciur()
{
    for(int i=2;i<=n;++i){
        if(!prim[i]){
            for(int j=i+i;j<=n;j+=i)
                prim[j]=1,dv[j]=i;
        }
    }
}

int main()
{
    ifstream f("fractii.in");
    ofstream g("fractii.out");
    f>>n;
    ciur();
    fi[1]=1;
    for(int i=2;i<=n;++i){

        int x = i;
        if(prim[ x ]==0) /// daca e prim
            fi[x]=x-1;
        else{

            int rez = 0 , pw = 1 ;
            while(x%dv[i]==0)
                x/=dv[i];

            if(x == 1) /// de forma fi ( x ^ p )
            {
                int b = dv[i] , incape = i/dv[i];
                fi[i] =  ( b - 1 ) *1ll* incape;
            }
            else /// de forma fi ( a * b ) , unde gcd(a,b) = 1
                fi[ i ] = fi[ x ] *1ll* fi[ i/x ];
        }
        s+=2*fi[i];
    }
    g<<++s;
    return 0;
}