Cod sursa(job #767452)

Utilizator test_666013Testez test_666013 Data 13 iulie 2012 16:19:44
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <cstdio>
#include <cstring>

#define MAX 1000001
#define MOD 9973

int pr[80000],nr;

void ciur(){
    bool p[MAX];
    int i = 2;
    while( i <= 1000 )
    {
        while( p[i] )i++;
        for(int j=i*i;j<MAX;j+=i) p[j] = 1;
        i++;
    }
    for(int i=2;i<MAX;i++)
    if( !p[i] )pr[++nr] = i;
   // printf("%d\n",nr);
}

void desc(long long n){
    long long sum = 1, p;
    int nr = 1, d,i = 1;
    while( i <= nr && n != 1 && pr[i] * pr[i] <= n )
    {
        if( n % pr[i] == 0)
        {
            d = 0;
            p = pr[i];
            while( n%pr[i] == 0)
            {
                d++;
                p *= pr[i];
                n /= pr[i];
            }
            nr *= (d+1);
            sum *= ( p - 1 ) / (pr[i] - 1);
        }
        i++;
    }
    if( n != 1)
    {
        nr *= 2;
        sum *= (n*n - 1) / ( n - 1);
    }
     printf("%d %lld\n",nr,sum);
}

int main(){
    long long n;
    int t;
    freopen("ssnd.in","r",stdin);
    freopen("ssnd.out","w",stdout);

    ciur();
        scanf("%d",&t);
        while(t--)
        {
            scanf("%lld",&n);
           desc(n);
        }
    return 0;
}