Cod sursa(job #2603161)

Utilizator CamelcamelCamel Camel Camelcamel Data 18 aprilie 2020 17:45:53
Problema Fractii Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.03 kb
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;

ifstream in("fractii.in");
ofstream out("fractii.out");

int v[1000001],p[78499],G[9],g[9],t=1,n,gmax,stot=0,floc;

void Gwrite(int x){
    int mm=1;
    for(int i=1;i<=x;i++){
        if(p[i]==0)break;
        if(x%p[i]==0){G[mm]=p[i];mm++;}
    }
    gmax=mm-1;
}
void gplus(){
    for(int i=1;i<=gmax;i++){
        if(g[i]==1){g[i]=0;}
        else{g[i]=1;break;}
    }
}
void clean(){
    for(int i=0;i<=8;i++) G[i]=g[i]=0;
}

int main()
{
    in>>n;
    v[0]=v[1]=-1;
    for(int i=2;i<=n;i++) if(v[i]==0) for(int j=2;i*j<=n;j++) v[i*j]=1;
    for(int i=2;i<=n;i++) if(v[i]==0){p[t]=i;t++;}
    for(int i=2;i<=n;i++){
        Gwrite(i);
        stot+=i;
        for(int j=1;j<=pow(2,gmax);j++){
            floc=1;
            for(int k=1;k<=gmax;k++){
                if(g[k]==1) floc*=-G[k];
            }
            if(floc!=1)stot+=i/floc;
            gplus();
        }
        clean();
    }
    out<<stot*2+1;
}