Cod sursa(job #1496287)

Utilizator cojocarugabiReality cojocarugabi Data 4 octombrie 2015 18:14:11
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
# include <bits/stdc++.h>
# define x first
# define y second
using namespace std;
ifstream fi("ssnd.in");
ofstream fo("ssnd.out");
vector < int > primes;
bitset < 1000005 > p;
const int mod = 9973;
int pow(int a,int b,int mod)
{
    int ans = 1;
    while (b)
    {
        if (b&1) ans = (ans * a) % mod;
        a = (a * a) % mod;
        b /= 2;
    }
    return ans;
}
pair < int , int > ans(long long n)
{
    pair < int , int > d = {1,1};
    for (auto it : primes)
    {
        if (1ll * it * it > n) break;
        int cnt = 1;
        int c = 1;
        while (!(n%it)) n /= it,++cnt,c = (c * it) % mod;
        d.x *= cnt;
        d.y = (d.y * ((((c * it - 1 + mod) % mod) * pow(it - 1,mod - 2,mod)) % mod)) % mod;
    }
    if (n != 1) d.x *= 2,d.y = (d.y * ((((n % mod) * (n * mod) + mod - 1) * pow(n-1,mod-2,mod)) % mod)) % mod;
    return d;
}
int main(void)
{
    int t;
    for (int i = 2;i <= 1e6;++i) p[i] = 1;
    for (int i = 4;i <= 1e6;i += 2) p[i] = 0;
    for (int i = 3;i*i <= 1e6;++i)
        if (p[i])
            for (int j = i*i;j <= 1e6;j += i + i)
                p[j] = 0;
    for (int i = 2;i <= 1e6;++i)
        if (p[i]) primes.push_back(i);
    ios_base :: sync_with_stdio(0);
    fi>>t;
    long long n;
    while (t --)
    {
        fi>>n;
        pair < int , int > d = ans(n);
        fo << d.x << ' ' << d.y << '\n';
    }
    return 0;
}