Cod sursa(job #1466679)

Utilizator CollermanAndrei Amariei Collerman Data 29 iulie 2015 20:01:16
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <fstream>
#include <bitset>
using namespace std;
ofstream fout("ssnd.out");
ifstream fin("ssnd.in");
const int NMAX = 1000005;
const int MOD = 9973;

int t, lg, suma, nr;
long long n, p;
long long prime[NMAX];
bitset<NMAX> ciur;

void construieste_ciur()
{
    ciur[0] = ciur[1] = 1;
    for(int i=2; i<NMAX; i++) {
        if(!ciur[i]){
            prime[++lg] = i;
            for(int j=i+i; j<NMAX; j+=i)
                ciur[i] = true;
        }
    }
}

long long pow(long long b, long long e)
{
    long long sol = 1;

    while(e) {
        if(e & 1) sol *= b;
        b *= b;
        e >>= 1;
    }

    return sol;
}

int main()
{
    construieste_ciur();

    fin >> t;
    for(int i=1; i<=t; i++)
    {
        nr = suma = 1;

        fin >> n;
        for(int j=1; j<=lg && prime[j] * prime[j] <= n; j++) {
            if(n % prime[j] == 0) {
                p = 0;
                while(n % prime[j] == 0) {
                    n /= prime[j];
                    p++;
                }

                nr *= (p + 1);
                suma *= ((pow(prime[j], p + 1) - 1) / (prime[j] - 1)) % MOD;
            }
        }

        if(n > 1) {
            nr *= 2;
            suma = suma * (n + 1) % MOD;
        }

        fout << nr << ' ' << suma % MOD << '\n';
    }

    return 0;
}