Cod sursa(job #112626)

Utilizator devilkindSavin Tiberiu devilkind Data 6 decembrie 2007 11:03:13
Problema Sum Scor 75
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <stdio.h>
#define NMAX 100002

long int a[NMAX],x,i,j,k,cnt,n,m,pr[NMAX],div[NMAX];
long long sum;

void ciur()
{

long long j;

for (i=2;i<=n;i++) a[i]=1;

for (i=2;i<=n;i++)
       if (a[i])
        {
        pr[ ++pr[0] ] = i;
        for (j=i*i;(j>0)&&(j<=n);j+=i) a[j]=0;
        }
}

void back(long int nivel, long int nr1, long int p)
{
long long t;

if (nivel==div[0]+1) {
                     t=x/p;

                     if (nr1%2==1) cnt-=t;
                        else cnt+=t;
                     
                     t= (t*(t+1)/2 ) * (long long) p;

                     if (nr1%2==1) sum=sum-(long long)t;
                        else sum=sum+(long long)t;
                     return;
                     }

back(nivel+1,nr1,p);
back(nivel+1,nr1+1,p*div[nivel]);

}


int main()
{

        freopen("sum.in","r",stdin);
        freopen("sum.out","w",stdout);

        n=100000;
        ciur();

        scanf("%ld",&k);

        for (;k;k--)
                {
                scanf("%ld",&n);
                div[0]=0;
                x=n;

                for (i=1;pr[i]*pr[i]<=n;i++)
                        {
                        if (n%pr[i]) continue;
                        div[ ++div[0] ] = pr[i];
                        for (;n%pr[i]==0;n/=pr[i]);
                        }

                if (n>1) div[ ++div[0] ] = n;

                sum=0;cnt=0;
                back(1,0,1);
                sum=sum*2+x*cnt;
                printf("%lld\n",sum);
                }
        return 0;
}