Cod sursa(job #1317090)

Utilizator tudorcomanTudor Coman tudorcoman Data 14 ianuarie 2015 15:47:47
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <cstdio>
using namespace std;

const int NMAX = 1000005;
const int MOD = 9973;
long long div[1000005],t,n,k;
bool ciur[NMAX];

void ciuruiala()
{
    for(int i = 2; i < NMAX; ++i)
    {
        if(ciur[i] == 0)
        {
            div[++k] = i;

            for(int j = i+i; j < NMAX; j += i)
            {
                ciur[j] = 1;
            }
        }
    }
}

inline long long pow(long long b, long long p)
{

    if(p==0) return 1;
    else
    {
        int aux = pow (b,p/2);
        if (p & 1)
            return aux*aux%MOD*b%MOD;
        else
            return aux*aux%MOD;
    }
}

int main()
{
    freopen ("ssnd.in","r",stdin);
    freopen ("ssnd.out","w",stdout);
    ciuruiala();
    scanf("%lld",&t);
    for(; t; --t)
    {
        scanf("%lld",&n);

        long long nd = 1, sd = 1;

        for(int i = 1; i <= k && 1LL * div[i] * div[i] <= n; ++i)
        {
            if(n % div[i]) continue;
            int p = 0;
            while(n % div[i] == 0)
            {
                n /= div[i];
                ++p;
            }
            nd *= (p+1);
            int p1 = (pow(div[i], p+1) - 1) % MOD;
            int p2 = pow(div[i]-1, MOD-2) % MOD;
            sd = (((sd * p1) % MOD) * p2) % MOD;
        }

        if(n > 1)
        {
            nd *= 2;
            sd = (1LL*sd*(n+1) % MOD);
        }
        printf("%lld %lld\n",nd,sd);
    }
}