Cod sursa(job #1688099)

Utilizator flibiaVisanu Cristian flibia Data 13 aprilie 2016 11:35:56
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <iostream>
#include <fstream>
#include <cmath>

#define MOD 9973
#define MAX 2000006

using namespace std;

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

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

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

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

int lol(int x, int y, int 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(int i = 1; i <= t; i++)
    {
        in >> nr;
        nd = 1;
        sd = 1;
        for(int j = 1; j <= sqrt(nr); j++)
        {
            if(a[j] == 1 && nr % j == 0)
            {
                nd = nr * (lol(nr, 0, j) + 1); 
                sd = sd * ( (pow(j,lol(nr, 0, j))-1) / (j - 1) );
            }            
        }
        out << nd << " " << sd << "\n";

    }
    //out << (lol(13, 0, 13) + 1); 
    return 0;
}