Cod sursa(job #2087207)

Utilizator shantih1Alex S Hill shantih1 Data 13 decembrie 2017 09:46:53
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <iostream>
#include <fstream>
#define ll long long
#define crmx 1000000
#define mod 9973

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

ll n, i, j, t, np, dv[80000], NR, SUM, MARE, x, y, h;
bool b[1000010];

void invmod (ll a, ll b, ll &x, ll &y)
{
    if (b == 0)
    {   x = 1;  y = 0;  }
    else
    {
        ll x0, y0;
        invmod (b, a%b, x0, y0);
        x = y0;
        y = x0-(a/b)*y0;
    }
}

int main () {

    for (i = 2; i <= crmx; i++)
        if (b[i] == 0)
    {
        np++;   dv[np] = i;
        for (j = 2; j*i <= crmx; j++)
            b[i*j] = 1;
    }

    fin >> t;
    while (t)
    {
        fin >> n;
        NR = 1;
        MARE = 1;
        ll d = 1;
        while (n != 1 && d <= np)
        {
            ll pt = 0;
            while (n%dv[d] == 0)
            {   pt++;   n /= dv[d];   }
            if (pt != 0)
            {
                SUM = 1;
                NR *= pt+1;
                NR %= mod;
                for (i = 1; i <= pt+1; i++)
                    SUM = (SUM*dv[d])%mod;
                SUM--;
                invmod(dv[d]-1, mod, x, y);
                if (x < 0)  x += (-x/mod)*mod+mod;
                SUM = (SUM*x)%mod;
                MARE *= SUM;
            }
            d++;
        }
        fout << NR << " " << MARE << "\n";
        t--;
    }
}