Cod sursa(job #2086031)

Utilizator BourucLiviuBouruc Petru Liviu BourucLiviu Data 11 decembrie 2017 10:26:18
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <fstream>

#define N 1000000
#define MOD 9973

using namespace std;

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

int prim[N+5];
bool a[N+5];

void ciur()
{
    for(int i = 4; i <= N; i += 2) a[i] = 1;
    for(int i = 3; i * i <= N; i += 2)
        if(!a[i])
            for(int j = i * i; j <= N; j += 2*i) a[j] = 1;
    for(int i = 2; i <= N; ++i)
        if(!a[i]) prim[++prim[0]] = i;
}

int pow(int n, int x)
{
    int p = 1;
    while(x)
    {
        if(x % 2 == 1)
        {
            p = (p * n) % MOD;
            x--;
        }
        n = (n * n) % MOD;
        x /= 2;
    }
    return p;
}

void solve(long long x)
{
    int nr = 1, sum = 1;
    for(int i = 1; i <= prim[0] && prim[i] * prim[i] <= x; ++i)
        if(x % prim[i] == 0)
        {
            int d = 0;
            while(x % prim[i] == 0)
            {
                x /= prim[i];
                d++;
            }
            nr *= (d+1);
            int sus = (pow(prim[i], d+1) - 1) % MOD;
            int jos = pow(prim[i]-1, MOD-2);
            sum = (((sum * sus) % MOD) * jos) % MOD;
        }
    if(x > 1)
    {
        nr *= 2;
        sum = (sum * (x+1)) % MOD;
    }
    fout << nr << " " << sum << '\n';
}

int main()
{
    ciur();

    int t;
    long long n;
    fin >> t;
    while(t--)
    {
        fin >> n;
        solve(n);
    }
    fin.close(); fout.close();
    return 0;
}