Cod sursa(job #762104)

Utilizator gabrielvGabriel Vanca gabrielv Data 28 iunie 2012 18:07:29
Problema Sum Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <cstdio>
#include <cstring>
#define NMAX 100055
#define Sum(N) (N*(N+1)/2)

using namespace std;

bool ciur[NMAX],v[2*NMAX],nrprim[2*NMAX];
int N,k,prim[NMAX];
long long S;

void ciur_er()
{
    int i,j;
    prim[++k]=2;
    for(i=3;i<=NMAX;i+=2)
        if(!ciur[i])
        {
            prim[++k]=i;
            nrprim[i]=1;
            for(j=3*i;j<=NMAX;ciur[j]=1,j+=i+i);
        }
}

void afisare()
{
    printf("%lld\n",S);
}

int cmmdc(int a, int b)
{
    int r=1;
    while(r)
    {
        r=a%b;
        a=b;
        b=r;
    }

    return a;
}

void mark()
{
    long long i,j,n;
    n=N;
    v[1]=1;
    for(i=1;i<=k && n && prim[i]*prim[i]<=n;i++)
        if(n%prim[i]==0)
        {
            for(j=1;j<=2*NMAX;j++)
                if(v[j] && j*prim[i]<=2*NMAX)
                    v[j*prim[i]]=1;
                else
                    if(j%prim[i]==0)
                        v[j]=1;
            n/=prim[i];
        }
    if(n)
        for(j=1;j<=2*NMAX;j++)
                if(v[j] && j*n<=2*NMAX)
                    v[j*n]=1;
                else
                    if(j%n==0)
                        v[j]=1;
}

void adun()
{
    int i;
    S=0;
    v[1]=0;
    for(i=1;i<=2*N;i++)
        if(!v[i])
            S+=i;
}

void solve()
{
    if(nrprim[N]==1)
    {
        S=Sum(2*1LL*N)-3*N;
        return;
    }

    int i,j;
    mark();
    adun();
    memset(v,0,sizeof(v));

}
int main()
{
    freopen("sum.in","r",stdin);
    freopen("sum.out","w",stdout);
    int T;
    ciur_er();
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&N);
        solve();
        afisare();
    }
    return 0;
}