Cod sursa(job #1466618)

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

long long t, n;
long long prime[NMAX], p[NMAX], d[NMAX];
bitset<NMAX> ciur;

void construieste_ciur()
{
    ciur.set();
    ciur[0] = ciur[1] = false;

    for(int i=2; i<NMAX; i++) {
        if(ciur[i]){
            prime[++prime[0]] = i;
            for(int j=i+i; j<NMAX; j+=i)
                ciur[i] = false;
        }
    }
}

long long pow(long b, 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++)
    {
        long long j = 1, nr = 1, suma = 1;

        fin >> n;
        while(n > 1) {
            if(n % prime[j] == 0) {
                p[++p[0]] = prime[j];
                while(n % prime[j] == 0) {
                    d[p[0]]++;
                    n /= prime[j];
                }
            }
            j++;
        }

        for(int i=1; i<=p[0]; i++)
            nr *= (d[i] + 1);

        for(int i=1; i<=p[0]; i++)
            suma *= ((pow(p[i], d[i] + 1) - 1) / (p[i] - 1));

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

        for(int i=1; i<=p[0]; i++) d[i] = 0, p[i] = 0;
        p[0] = 0;
        d[0] = 0;
    }

    return 0;
}