Cod sursa(job #238459)

Utilizator DraStiKDragos Oprica DraStiK Data 2 ianuarie 2009 11:16:04
Problema Sum Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <stdio.h>
int phi[100005],ciur[100005],test[100005],exp[100005];
int m,max;
void read ()
{
    int i;
    scanf ("%d",&m);
    for (i=1; i<=m; ++i)
    {
        scanf ("%d",&test[i]);
        phi[test[i]]=1;
        if (test[i]>max)
			max=test[i];
	}
}
void ciuru ()
{
    int i,j;
    for (i=2; i<=max; ++i)
        if (!ciur[i])
            for (j=2*i; j<=max; j+=i)
                ciur[j]=1;
}
void desc (int n)
{
	int f,p,i;
	f=2;
	for (i=1; i<=max; ++i)
		exp[i]=0;
    while (n!=1)
    {
          p=0;
          while (n%f==0)
          {
                n/=f;
                p++;
          }
          if (p!=0)
            exp[f]=1;
          f++;
    }
}
void solve ()
{
    int i,j,k;
    for (i=1; i<=m; ++i)
    {
        desc (test[i]);
        for (j=2; j<=test[i]; ++j)
            if (exp[j])
            {
                phi[test[i]]*=j-1;
                for (k=1; k<exp[j]; ++k)
                    phi[test[i]]*=j;
            }
        printf ("%d\n",2*phi[test[i]]*test[i]);
    }
}
int main ()
{
    freopen ("sum.in","r",stdin);
    freopen ("sum.out","w",stdout);
    read ();
    ciuru ();
    solve ();
    return 0;
}