Cod sursa(job #201815)

Utilizator savimSerban Andrei Stan savim Data 4 august 2008 11:03:14
Problema Sum Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <stdio.h>
#include <math.h>

int i,j,n,k,x,d,cop,v,t,val,numar;
int div[20],ciur[200010],vect[20],nr[1000];
long long sum;

void back(int p)
{
    int i;

    for (i=p; i>=1; i--)
    if (vect[i]==0)
    {
        vect[i]=1;
        back(i-1);
        vect[i]=0;
    }

    numar=0;val=1;
    for (i=1; i<=k; i++)
    {
        numar+=vect[i];
        if (vect[i]) val*=div[i];
    }

    if (numar>1)
    {
        nr[++t]=val;
    }
}

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

    scanf("%d",&n);
    for (i=1; i<=n; i++)
    {
        scanf("%d",&x);

        k=0;v=x;
        if (x%2==0)
        {
            div[++k]=2;
            while (x%2==0) x/=2;
        }
        
        while (x>1)
        {
            d=sqrt(x);cop=x;

            for (j=3; j<=d; j+=2)
                if (d%j==0)
                {
                    div[++k]=j;
                    while (x%j==0) x/=j;
                    break;
                }

            if (x==cop) {div[++k]=x;x=1;}
        }

        x=v;
        sum=(long long)x*(2*x+1);

        //scad unele numere de doua ori
        for (j=1; j<=k; j++)
        {
            d=(2*x)/div[j];
            sum-= div[j] * (d*(d+1)/2);
        }

        t=0;
        back(k);

        for (j=1; j<=t; j++)
        {
            d=(2*x)/nr[j];
            sum+=nr[j]* (d*(d+1)/2);
        }

        printf("%lld\n",sum);
    }


    return 0;
}