Cod sursa(job #1071449)

Utilizator lorundlorund lorund Data 2 ianuarie 2014 23:08:21
Problema Suma si numarul divizorilor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 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--){
        long long x;
        int i=1, n=1, s=1;

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

    delete[] prime;
    return 0;
}