Cod sursa(job #1984370)

Utilizator Mihai_PredaPreda Mihai Dragos Mihai_Preda Data 24 mai 2017 16:51:01
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

const int MOD = 9973;

long long n;
long long nrDiv, sum;
bool compus[1000000 + 5];
vector<long long> prime;

void ciur()
{
    for(int i = 2; i <= 1e3; ++i)
        for(int j = i * i; j <= 1e6; j += i)
            compus[j] = true;
    for(int i = 2; i <= 1e6; ++i)
        if(compus[i] == false)
            prime.push_back(i);
}

long long power(long long base, long long exp)
{
    if(exp == 0)
        return 1;
    if(exp % 2 == 0)
    {
        int x = power(base, exp / 2);
        return (x * x) % MOD;
    }
    return (base * power(base, exp - 1)) % MOD;
}

inline long long invers(long long x)
{
    return power(x, MOD - 2);
}

void rezolvare()
{
    vector<pair<int, int> > factori; //.first = base, .second = exp
    int nr;
    for(int i = 0; i < prime.size() && prime[i] * prime[i] <= n; ++i)
    {
        nr = 0;
        while(n % prime[i] == 0)
        {
            nr++, n /= prime[i];
        }
        if(nr != 0)
            factori.push_back(make_pair(prime[i], nr));
    }
    if(n != 1)
        factori.push_back(make_pair(n, 1));
    long long base, exp;
    nrDiv = 1;
    sum = 1;
    long long x = 0;
    for(auto &p:factori)
    {
        base = (p.first % MOD);
        exp = p.second;
        nrDiv *= (exp + 1);
        x = ((power(base, exp + 1) - 1) * invers(base - 1)) % MOD;
        sum = (sum * x) % MOD;
    }
}

int main()
{
    ciur();
    int t;
    ifstream in("ssnd.in");
    ofstream out("ssnd.out");
    in >> t;
    for(int i = 1; i <= t; ++i)
    {
        in >> n;
        rezolvare();
        out << nrDiv << " " << sum << "\n";
    }
    in.close();
    out.close();
    return 0;
}