Cod sursa(job #1643854)

Utilizator FlorinHajaFlorin Gabriel Haja FlorinHaja Data 9 martie 2016 20:27:57
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <fstream>
#define mod 9973
using namespace std;

ifstream f("ssnd.in");
ofstream g("ssnd.out");

bool p[600005];
int P[800000], np, t, i, N;
long long nsum, ndiv, x, prr, p2;

void genprim()
{
    int i, j;
    P[np=1] = 2;
    for (i = 1; 2*i+1 <= 1000000; i++)
        if (p[i] == 0)
            for (j = 3*i+1; 2*j+1 <= 1000000; j+= 2*i+1)
                p[j] = 1;
    for (i = 1; 2*i+1 <= 1000000; i++)
        P[++np] = 2*i+1;
}

int pow(int a, int b)
{
    int c = a, rez = 1;
    for (;b > 1; b /= 2)
    {
        if (b&1)
            rez = (rez*c)%mod;
        c = (c*c)%mod;
    }
    return rez;
}

int main()
{
    genprim();
    for (f>>t;t > 0;t--)
    {
        f >> x;
        //g << x << " ";
        ndiv = nsum = 1;
        for (i = 1; i <= np && P[i]*P[i] <= x; i++)
        if (x%P[i] == 0)
        {
            prr = P[i];
            N = 0;
            while (x%P[i] == 0)
            {
                x /= P[i];
                N++;
                prr *= P[i];
            }
            ndiv = ndiv*(N+1);
            p2 = pow(P[i]-1, mod-2)%mod;
            nsum = (((nsum*(prr-1))%mod)*p2)%mod;
        }
        if (x > 1)
            ndiv = (ndiv*2), nsum = (1LL*nsum*(x+1))%mod;
        g << ndiv << " " << nsum << "\n";
    }
    return 0;
}