Cod sursa(job #1071365)

Utilizator lorundlorund lorund Data 2 ianuarie 2014 22:18:14
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <cstdio>
#include <bitset>

int *prim(){
    std::bitset<1000002> ciur;
    int *v = new int[80000];

    v[0] = 1;
    v[1] = 2;
    for (int i=3; i<1000000/2; i+=2){
        if (!ciur[i]){
            v[++v[0]] = i;
            for (int j=i+i+i; j<1000000; j+=i << 1)
                ciur[j] = 1;
        }
    }
    for (int i=500001; i<1000000; i+=2)
        if (!ciur[i]){
            v[++v[0]] = i;
        }
    return v;
}

int main()
{
    int *prime = prim();
    int t;

    freopen("ssnd.in", "r", stdin);
    freopen("ssnd.out", "w", stdout);

    scanf("%d", &t);
    while (t--){
        int x, n=1, s=1;
        int i=1;

        scanf("%d", &x);
        while (x>1){
            int c=0, p=1;
            while (x%prime[i]==0){
                p*=prime[i];
                x/=prime[i];
                ++c;
            }
            if (c){
                n*=c+1;
                s*=(p*prime[i]-1)/(prime[i]-1);
            }
            ++i;
        }
        printf("%d %d\n", n, s);
    }

    delete[] prime;
    return 0;
}