Cod sursa(job #2149138)

Utilizator lixiLixandru Andrei lixi Data 2 martie 2018 12:37:00
Problema Suma si numarul divizorilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 2.19 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 EuclidExtins(int a, int b, int &d, int &x, int &y)
{
    int x1 = 0, y1 = 1;
    x = 1, y = 0;
    while(b != 0)
    {
        int q = a / b;
        int r = a % b;
        a = b;
        b = r;
        int x0 = x - x1 * q;
        int y0 = y - y1 * q;
        x = x1;
        y = y1;
        x1 = x0;
        y1 = y0;
    }
    d = a;
}
int inversmodular(int A, int N)
{
    int X, Y, d;
    EuclidExtins(A, N, d, X, Y);
    X %= N;
    if(X < 0)X += N;
    return X;
}
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;
        if(n % pr[ind] == 0)
        {
            while(n % pr[ind] == 0)
            {
                exp++;
                n /= pr[ind];
            }
            nrd = nrd * (exp + 1);
            sumd = ((sumd * (putere(pr[ind], exp + 1) - 1)) % MOD * inversmodular(pr[ind] - 1, MOD)) % MOD;
            ind++;
        }
        else
            ind++;
    }
    if(n > 1)
    {
        nrd *= 2;
        sumd = ((sumd * (putere(n, 2) - 1)) % MOD * inversmodular(n - 1, MOD)) % 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;
}