Cod sursa(job #64682)

Utilizator sealTudose Vlad seal Data 4 iunie 2007 21:21:26
Problema Sum Scor 85
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.88 kb
#include<stdio.h>
#define Xm 100001
long long A[Xm];
int Pf[6][Xm],Npf[Xm],P[Xm];

long long sum(int i, int j, int x)
{
    int k;
    long long s=(i<<1)/x;
    s=(s*(s+1)>>1)*x;
    for(k=0;k<j;++k)
	s-=sum(i,k,x*Pf[k][i]);
    return s;
}

void preprocess()
{
    int i,j,np=1;

    P[0]=2;
    for(i=3;i<Xm;i+=2)
    {
	for(j=0;P[j]*P[j]<=i && i%P[j];++j);
	if(P[j]*P[j]>i)
	    P[np++]=i;
    }
    for(i=0;i<np;++i)
	for(j=P[i];j<Xm;j+=P[i])
	    Pf[Npf[j]++][j]=P[i];

    for(i=2;i<Xm;++i)
    {
	A[i]=(long long)i*((i<<1)+1);
	for(j=0;j<Npf[i];++j)
	    A[i]-=sum(i,j,Pf[j][i]);
    }
}

void solve()
{
    int n,x;

    freopen("sum.in","r",stdin);
    freopen("sum.out","w",stdout);
    scanf("%d",&n);
    while(n--)
    {
	scanf("%d",&x);
	printf("%lld\n",A[x]);
    }
}

int main()
{
    preprocess();
    solve();
    return 0;
}