Cod sursa(job #1493697)

Utilizator fluture.godlikeGafton Mihnea Alexandru fluture.godlike Data 29 septembrie 2015 20:00:06
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.92 kb
#include <cstdio>
#include <math.h>

#define MOD 9973
#define VMAX 1000007
#define NMAX 80007
#define LL long long

int prim[NMAX], n, ct = 1, len, c;
char ciur[VMAX];
LL nr, ans, sum;
LL power(LL a, LL b)
{
    LL sol = 1;
    for(; b; b>>=1)
    {
        if(b&1)
        {
            sol *= a;
        }
        a*= a;
    }
    return sol;
}
void init()
{
    //printf("check1\n");
    for(int i = 2; i<= VMAX-1; ++i)
    {
        if(ciur[i]) continue;
        if(i*i >= VMAX) break;
        for(int j = i*i; j<= VMAX-1; j+=i) ciur[j] = 1;
    }
    //printf("check1\n");
    for(int i = 2; i<= VMAX-1; ++i)
    {
        if(ciur[i]) continue;
        prim[ct] = i;
        ct++;
    }
}
void solve()
{
    for(int i = 1; i< ct; ++i)
    {
        if(prim[i]*prim[i] > nr) break;
        //printf("nr = %lld i = %d prim[i] = %d\n", nr, i, prim[i]);
        if(nr%prim[i]) continue;
        //printf("check\n");
        c = 0;
        while(!(nr%prim[i]))
        {
            nr /= prim[i];
            ++c;
        }
        ans *= (c+1);
        sum *= (power(prim[i], c+1)-1);
        sum /= (prim[i]-1);
        sum %= MOD;
        //printf("nr = %lld ans = %lld sum = %lld\n", nr, ans, sum);
        if(nr == 1) break;
        //printf("nr = %lld ans = %lld sum = %lld\n", nr, ans, sum);
    }
    //printf("check5\n");
    if(nr-1)
    {
        ans *= 2;
        sum *= (nr*nr-1);
        sum /= (nr-1);
        sum %= MOD;
    }
}

int main()
{
    freopen("ssnd.in", "r", stdin);
    freopen("ssnd.out", "w", stdout);
    //printf("check\n");
    init();
    scanf("%d", &n);
    //printf("check\n");
    for( ; n; --n)
    {
        scanf("%lld", &nr);
        ans = 1;
        sum = 1;
        len = sqrt(nr);
        //printf("check3\n");
        solve();
        //printf("check4\n");
        printf("%lld %lld\n", ans, sum);
    }
    return 0;
}