Cod sursa(job #762093)

Utilizator gabrielvGabriel Vanca gabrielv Data 28 iunie 2012 17:26:03
Problema Sum Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <cstdio>
#include <cstring>
#define NMAX 100015
#define Sum(N) (N*(N+1)/2)

using namespace std;

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

void ciur_er()
{
    int i,j;
    ciur[2]=prim[2]=1;
    for(i=3;i<=NMAX;i+=2)
        if(!ciur[i])
        {
            prim[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 solve()
{
    if(prim[N]==1)
    {
        S=Sum(2*1LL*N)-3*N;
        return;
    }

    int i,j;
    S=1;
    for(i=2;i<=2*N;i++)
    {
        if(v[i])
            continue;
        if(cmmdc(i,N)==1)
        {
            for(j=i;j<=2*N;v[j]=1,j+=i)
                if(!viz[j] && !v[j])
                    S+=j,viz[j]=1;
        }
        else
            for(j=i;j<=2*N;v[j]=1,j+=i);
    }

    memset(v,0,sizeof(v));
    memset(viz,0,sizeof(viz));

}
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;
}