Cod sursa(job #2456795)

Utilizator mircearoataMircea Roata Palade mircearoata Data 15 septembrie 2019 14:46:58
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.64 kb
#pragma GCC optimize("O3")

#include <iostream>
#include <fstream>

using namespace std;

ifstream in("ssnd.in");
ofstream out("ssnd.out");

#define MOD 9973

long long put(int b, int e)
{
    int ret = 1;
    b %= MOD;
    while(e)
    {
        if(e & 1)
        {
            ret *= b;
            ret %= MOD;
        }
        b *= b;
        b %= MOD;
        e >>= 1;
    }
    return ret;
}

int primes[78500], cntPrimes;
bool ciur[1000005];

int main()
{
    int t;
    in >> t;
    primes[cntPrimes++] = 2;
    for(int i = 4; i <= 1000000; i += 2)
        ciur[i] = 1;
    for(int i = 3; i <= 1000000; i += 2)
    {
        if(!ciur[i])
        {
            primes[cntPrimes++] = i;
            if(1000000/i >= i)
            {
                for(int j = i * i; j <= 1000000; j += i)
                    ciur[j] = 1;
            }
        }
    }
    while(t--)
    {
        long long x;
        int cnt = 1;
        int sum = 1;
        in >> x;
        for(int i = 0; i < cntPrimes && 1LL * primes[i] * primes[i] <= x; i++)
        {
            int p = primes[i];
            if(x % p == 0)
            {
                int e = 0;
                while(x % p == 0)
                {
                    x /= p;
                    e++;
                }
                cnt *= e+1;
                sum = (sum * ((put(p, e+1) - 1) % MOD) * (put(p-1, MOD-2) % MOD)) % MOD;
            }
        }
        if(x != 1)
        {
            cnt *= 2;
            sum = (1LL * sum * (x*x - 1) / (x - 1)) % MOD;
        }
        out << cnt << ' ' << sum << '\n';
    }
    return 0;
}