Cod sursa(job #171554)

Utilizator bogdanhm999Casu-Pop Bogdan bogdanhm999 Data 4 aprilie 2008 15:46:14
Problema Sum Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <stdio.h>
#include <bitset>
#define xMax 100005
#define pMax 400

using namespace std;
long n,x,i,j,r,p[200],q,d[200],k[200],nr;
long long rez[100005];
bitset <400>prim;

long power(long b,long p){
     long rez=1;
     if (p==1)return b;
     while (p){
           if ((long)(p&1)==1)rez=rez*b;
           b=b*b;p>>=1;
     }
return rez;
}

int main(){
    freopen("sum.in","r",stdin);
    freopen("sum.out","w",stdout);
    
    prim.set();
    prim[1]=0;
    for (i=1;i<=pMax;i++)
        if (prim[i])
           for (j=2;j<=pMax/i;j++)
               prim[i*j]=0;
    for (i=2;i<=pMax;i++)
        if (prim[i])p[++q]=i;
    
    for (i=1;i<=xMax;i++){
        x=i;
        j=1;
        r=0;
        while (p[j]*p[j]<=x){
              if (x%p[j]==0){
                 d[++r]=p[j];
                 k[r]=0;
                 while (x%p[j]==0){
                       k[r]++;
                       x/=p[j];
                 }
              }
              j++;
        }
        if (x>1){d[++r]=x;k[r]=1;}
        
        if (i==10000)
           nr=1;
           
        nr=1;  
        for (j=1;j<=r;j++)
            nr*=(d[j]-1)*power(d[j],k[j]-1);
        rez[i]=(long long)2*nr*i;
        
    }
    
    
    scanf("%ld",&n);
    for (i=1;i<=n;i++){
        scanf("%ld",&x);
        printf("%lld\n",rez[x]);
    }

return 0;
}