Cod sursa(job #2533293)

Utilizator BAlexandruBorgovan Alexandru BAlexandru Data 28 ianuarie 2020 21:21:15
Problema Sum Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("sum.in");
ofstream g("sum.out");

int n,x,i,j;
bool c[100001];
int u[200001];
int p[10000], nrp;
int fact[100], nrf;

void Ciur(int x)
{
    c[0]=c[1]=1;
    for (i=2;i<=x;i++)
        if (!c[i])
        {
            nrp++;
            p[nrp]=i;
            for (j=i*2;j<=x;j+=i)
                c[j]=1;
        }
}

void GetFact(int x)
{
    nrf=0;
    int y=x;
    if (!c[x])
    {
        nrf=1;
        fact[nrf]=x;
    }
    else
    {
        for (int i=1;p[i]*p[i]<=x;i++)
            if (x%p[i]==0)
            {
                nrf++;
                fact[nrf]=p[i];
                while (x%p[i]==0)
                    x/=p[i];
            }
        if (x>1)
        {
            nrf++;
            fact[nrf]=x;
        }
    }
}

long long GetSum(int x)
{
    x=x*2;
    long long s=1LL*x*(x+1)/2;
    for (int i=1;i<=nrf;i++)
        for (int j=fact[i];j<=x;j=j+fact[i])
            if (u[j]!=n)
            {
                s=s-j;
                u[j]=n;
            }
    return s;
}

int main()
{
    f>>n;
    Ciur(100000);
    while (n--)
    {
        f>>x;
        GetFact(x);
        g<<GetSum(x)<<"\n";
    }
    return 0;
}