Cod sursa(job #2667439)

Utilizator leru007Leru Ursu leru007 Data 3 noiembrie 2020 14:29:13
Problema Fractii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <bits/stdc++.h>
#define ll long long
#define pb push_back
#define mp make_pair
using namespace std;
ifstream fin("fractii.txt");
ofstream fout("fractii.out");
ll n,k,i,j;
ll eul[1000006];
bool prim[1000006];
vector<ll> pri;
ll lgp(ll x,ll y){
    if(y==0) return 1;
    if(y==1) return x;
    ll t=lgp(x,y/2);
    if(y%2==1) return t*t*x;
    else return t*t;
}
ll euler(ll x){
    ll ans;
    ll j=0,power=1,nr;
    bool priim=0;
    while(j<pri.size()&&pri[j]<=x){
        if(priim==1) break;
        if(x%pri[j]==0){
            nr=pri[j];
            while(x%(nr*pri[j])==0) power++, nr*=pri[j];
            ans=lgp(pri[j],power-1)*(pri[j]-1);
            priim=1;
        }
        j++;
    }
    eul[x]=eul[x/nr]*ans;
    return eul[x];
}
int main(){
    eul[1]=1;
    fin>>n;
    pri.pb(2);
    prim[2]=1;
    for(i=3;i<=n;i+=2){
        if(prim[i]==0){
            for(j=i*i;j<=n;j+=2*i) prim[j]=1;
            pri.pb(i);
        }
    }
    //for(i=0;i<pri.size();i++) cout<<pri[i]<<" ";
    ll sum=0;
    for(i=2;i<=n;i++){
        sum+=euler(i);
        //cout<<euler(i)<<"\n";
    }
    sum=sum*2+1;
    fout<<sum;
    //cout<<pri.size();
    return 0;
}