Cod sursa(job #2149009)

Utilizator lixiLixandru Andrei lixi Data 2 martie 2018 11:29:51
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <iostream>
#include<fstream>
using namespace std;
ifstream f("ssnd.in");
ofstream g("ssnd.out");
int v[1000001], pr[1000001], nr;
const int MOD = 9973;
void ciur(long long n)
{
    int i, j;
    v[0] = 1;
    v[1] = 1;
    for(i = 4; i <= n; i += 2)
        v[i] = 1;
    for(i = 3; i * i <= n; i += 2)
    {
        if(v[i] == 0)
            for(j = i * i; j <= n; j += i)
                v[j] = 1;
    }
    pr[1] = 2;
    nr = 1;
    for(int i = 3; i <= n; i++)
        if(v[i] == 0)
            pr[++nr] = i;
}
int putere(int a, int p)
{
    int x = 1;
    while(p > 0)
        if(p % 2 == 0)
        {
            a = (long long)a * a % MOD;
            // a=1LL*a*a%MOD;
            p /= 2;
        }
        else
        {
            x = (long long)x * a % MOD;
            p--;
        }
    return x;
}
void sol(int n)
{
    int nrd = 1, ind = 1, exp, sumd = 1;
    while(ind <= nr && 1LL * pr[ind]*pr[ind] <= n)
    {
        exp = 0;
        while(n % pr[ind] == 0)
        {
            exp++;
            n /= pr[ind];
        }
        nrd = nrd * (exp + 1);
        sumd = (sumd * ((putere(pr[ind], exp + 1) - 1) / (pr[ind] - 1))) % MOD;
        ind++;
    }
    if(n > 1)
    {
        nrd *= 2;
        sumd = (sumd * (putere(n, 2) / (n - 1))) % MOD;
    }
    g << nrd << ' ' << sumd << '\n';
}
int main()
{
    int t;
    long long n;
    ciur(1000000);
    f >> t;
    for(int i = 1; i <= t; i++)
    {
        f >> n;
        sol(n);
    }
    return 0;
}