Cod sursa(job #64689)

Utilizator sealTudose Vlad seal Data 4 iunie 2007 22:03:37
Problema Sum Scor 85
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include<stdio.h>
#include<stdlib.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()
{
    char S[20],c;
    int n,i,j;
    long long x;

    freopen("sum.in","r",stdin);
    freopen("sum.out","w",stdout);
    scanf("%d\n",&n);
    while(n--)
    {
	gets(S);
	i=atoi(S);
	x=A[i];
	i=j=0;
	while(x)
	{
	    S[j++]=x%10+'0';
	    x/=10;
	}
	S[j--]=NULL;
	while(i<j)
	{
	    c=S[i];
	    S[i]=S[j];
	    S[j]=c;
	    ++i; --j;
	}
	puts(S);
    }
}

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