Cod sursa(job #1970102)

Utilizator radu.leonardoThe Doctor radu.leonardo Data 18 aprilie 2017 21:26:01
Problema Suma si numarul divizorilor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <bits/stdc++.h>
#define MaxN 1000000
#define MOD 9973
using namespace std;
ifstream f("ssnd.in");
ofstream g("ssnd.out");

bitset <MaxN> isPrime;
vector <int> Primes;

int pw(long long x,long long n)
{
    long long y=1;
    while(n>1)  if(n%2) y*=x,y%=MOD,x*=x,n/=2,x%=MOD;
                else         y%=MOD,x*=x,n/=2,x%=MOD;

    return x*y%MOD;
}

void computePrimes()
{
    Primes.push_back(2);
    for(int i = 3; i * i <= MaxN; i += 2)
        if(!isPrime[i])
        {
            Primes.push_back(i);
            for(int j = i * i; j <= MaxN; j += 2 * i)
                isPrime[j] = 1;
        }
}

void solve()
{
    long long T,N;
    f>>T;
    while (T--)
    {
        f>>N;
        long long nrDiv = 1,sumTop = 1,sumBot = 1;
        for(auto p:Primes)
        if(p*p <= N && N%p==0)
        {
            int d = 0;
            while (N % p == 0) ++d,N/=p;
            nrDiv *= (d+1);
            sumTop = (sumTop * (pw(p,d+1) - 1 ));
            sumBot = (sumBot * (p-1)) % MOD;
        }
        if (N != 1)
        {
            nrDiv *= 2;
            sumTop = (sumTop * (pw(N,2) - 1 + MOD));
            sumBot = (sumBot * (N-1)) % MOD;
        }
        g<<nrDiv<<' '<<(sumTop * pw(sumBot,MOD-2))%MOD<<'\n';
    }
}

int main()
{
    computePrimes();
    solve();
}