Cod sursa(job #2246312)

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

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()
{
    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;
        if(n == 1)
        {
            fo << 1 << ' ' << 1 << '\n';
            continue;
        }

        long long sum = 1, card = 1;
        long long m = n;
        for(long long i = 2; i*i <= m; ++i)
        {
            if(n%i == 0 && ciur[i] == 0)
            {
                long long e = 0;
                while(n%i == 0)
                {
                    e++;
                    n /= i;
                }
                card = card * (e+1);
                sum = sum * ((Lgput(i,e+1) - 1)/(i - 1)) % MOD;
            }
        }


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

    }

}