Cod sursa(job #2246305)

Utilizator crion1999Anitei cristi crion1999 Data 26 septembrie 2018 22:03:32
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <iostream>
#include <fstream>
#include <vector>
#define MOD 9973
using namespace std;
ifstream fi("ssnd.in");
ofstream fo("ssnd.out");
vector<int> ciur;

long long Lgput(long long a, long long n)
{
    long long sol = 1;
    while(n)
    {
        if(n%2 == 1)
            sol *= a;
        n /= 2;
        a *= a;
    }
    return sol;
}

void MakeCiur()
{
    ciur = vector<int>(1000001);
    for(int i = 2; i <= 1000001; ++i)
    {
        if(ciur[i] == 0)
        {
            for(int j = 2; j*i <= 1000001; j++)
            {
                ciur[j*i] = 1;
            }
        }
    }
}

int main()
{
    MakeCiur();
    long long n,t;
    fi>>t;
    while(t--)
    {
        fi>>n;
        long long sum = 1, card = 1;
        int m = n;
        for(int i = 2; i*i < m; ++i)
        {
            if(n%i == 0 && ciur[i] == 0)
            {
                int e = 0;
                while(n%i == 0)
                {
                    e++;
                    n /= i;
                }
                card = card * (e+1);
                sum = sum * ((Lgput(i,e+1) - 1)/(i - 1)) % MOD;
            }
        }
        if(m == 1)
        {
            fo << 1 << ' ' << 1 << '\n';
            continue;
        }

        if(card == 1)
            fo<<2<<' '<<m+1<<'\n';
        else
            fo<<card<<' '<<sum<<'\n';

    }

}