Cod sursa(job #2189825)

Utilizator timar_andreiTimar Andrei timar_andrei Data 29 martie 2018 10:04:46
Problema Suma si numarul divizorilor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <iostream>
#include <fstream>

#define NMAX 1000003
#define MOD 9973
using namespace std;

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

long long t;

int Prime[NMAX];
long long NP;
int v[NMAX];

void Ciur()
{
    for(long long i=2;i<=NMAX;i++)
    {
        if (v[i] == 0)
        {
            Prime[++NP] = i;
            for(long long j=i+i;j<=NMAX;j+=i)
                v[j] = 1;
        }
    }
}

long long pow (long long x,long long po)
{
    int rez = 1;
    x %= MOD;
    while(po)
    {
        if (po % 2)
        {
            rez *= x;
            rez %= MOD;
        }
        x *= x;
        x %= MOD;

        po /= 2;
    }

    return rez;
}

void Solve(long long x)
{
    if (v[x] == 0)
    {
        fout<<2<<' ';
        fout<<x%MOD+1%MOD<<'\n';

        return;
    }

    long long nrFact = 1;
    long long suma = 1;

    for(long long i=1;i<=NP && Prime[i]*Prime[i] <= x;i++)
    {
        if (x%Prime[i] != 0)
            continue;
        int  p = 0;
        while(x%Prime[i] == 0)
        {
            p++;
            x /= Prime[i];
        }

        nrFact *= (p + 1);
        int a,b;
        a = (pow(Prime[i],p+1) - 1) % MOD;
        b = pow(Prime[i]-1, MOD-2) % MOD;

        suma = (((suma*a)%MOD)*b)%MOD;
    }
    if (x > 1)
    {
        nrFact *= 2;
        suma = (suma*(x+1)) % MOD;
    }
    fout<<nrFact<<' '<<suma<<endl;
}

int main()
{
    Ciur();
    fin>>t;

    for(long long i=0;i<t;i++)
    {
        long long x;
        fin>>x;
        Solve(x);
    }

    return 0;
}