Cod sursa(job #953147)

Utilizator classiusCobuz Andrei classius Data 25 mai 2013 02:21:39
Problema Sum Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <cstdio>
#include <vector>

using namespace std;
FILE *f=fopen("sum.in","r");
FILE *g=fopen("sum.out","w");

void erst(vector<long long>&);
void fctrz(vector<long long>&,vector<long long>&);

int main()
{
    int t;
    vector<long long> p,phi(2,0);
    fscanf(f,"%lld",&t);
    phi[1]=1;

    erst(p);
    fctrz(phi,p);

    while(t--){
        long long n;
        fscanf(f,"%lld\n",&n);
        long long s=2*phi[n]*n;
        fprintf(g,"%lld\n",s);
    }

    return 0;
}

void erst(vector<long long>& v)
{
    vector<bool> ok(500,0);
    for(int i=2;i<500;i++){

        if(!ok[i]){
            v.push_back(i);

            for(int j=2;j*i<500;j++)
                ok[i*j]=1;
        }
    }
}

void fctrz(vector<long long>& phi,vector<long long>& p)
{
    for(int i=2;i<100001;i++){
        size_t j;

        for(j=p.size();j>0;j--){
            if(i%p[j-1]==0)
                break;
        }
        if(j==0||i==p[j-1])
            phi.push_back(i-1);
        else{
            if((i/p[j-1])%p[j-1]==0)
                phi.push_back(phi[i/p[j-1]]*p[j-1]);
            else
                phi.push_back(phi[i/p[j-1]]*(p[j-1]-1));
        }
    }
}