Cod sursa(job #1688213)

Utilizator flibiaVisanu Cristian flibia Data 13 aprilie 2016 12:27:54
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <iostream>
#include <fstream>
#include <cmath>

#define MOD 9973
#define MAX 1000004

using namespace std;

ifstream in("ssnd.in");
ofstream out("ssnd.out");

long long t, n, k, nd, sd, nr; bool a[MAX]; 

void ciur()
{
    for(long long i = 2; i <= MAX; i++)
    {
        if(a[i] == 0)
        {
            for(long long j = 2 ; j * i <= MAX; j++) a[j*i] = 1;
        }
    }
}

long long pow(long long x1, long long x2)
{
    long long rs;
    rs = 1;
    k = x1;
    while(x2 != 0)
    {
        if(x2 % 2 == 1) rs = (rs * k);
        k = (k * k);
        x2 /= 2;  
    }
    return rs;
}

long long lol(long long x, long long y, long long r)
{
    if(x % r != 0)
        return y;
    else
    {
        y++;
        return lol(x / r, y, r);
    }
}  
   
int main()
{
    a[1] = 1;
    ciur();
    in >> t;
    //out << t << "\n";
    for(long long i = 1; i <= t; i++)
    {
        in >> nr;
        k = 0;
        nd = 1;
        sd = 1;
        for(long long j = 2; j <= int(sqrt(nr)); j++)
        {
            if((a[j] == 0) && (nr % j == 0))
            {
                k++;
                nd = nd * (lol(nr, 0, j) + 1) % MOD; 
                sd = sd * ( (pow(j,lol(nr, 0, j) + 1) -1 ) / (j - 1) ) % MOD;
            }            
        }
        if(k == 0 && nr != 1) 
        {
            nd++;
            sd = sd + nr % MOD; 
        }
        out << nd % MOD << " " << sd % MOD << "\n";
    }
    return 0;
}