Cod sursa(job #1643706)

Utilizator FlorinHajaFlorin Gabriel Haja FlorinHaja Data 9 martie 2016 19:53:06
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 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, x2;

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;
}

long long pow(long long a, long long b)
{
    long long c = a, rez = 1;
    for (;b;b/=2)
    {
        if (b&1)
            rez *= c;
        c = c*c;
    }
    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)
        {
            N = 0;
            while (x%P[i] == 0)
            {
                x /= P[i];
                N++;
            }
            ndiv *= (N+1);
            nsum *= (pow(P[i], N+1)%mod-1)/(P[i]-1);
        }
        if (x > 1)
            ndiv *= 2, nsum = (nsum*(x+1))%mod;
        g << ndiv << " " << nsum << "\n";
    }
    return 0;
}