Cod sursa(job #2189822)

Utilizator timar_andreiTimar Andrei timar_andrei Data 29 martie 2018 09:56:11
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 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;

long long Prime[NMAX];
long long NP;
long long 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 factori[NMAX];

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 lastI=NP;

    for(long long i=1;i<=NP;i++)
    {

        if (x == 0 || x == 1)
        {
            lastI = i;
            break;
        }

        while(x%Prime[i] == 0)
        {
            factori[Prime[i]]++;
            x /= Prime[i];
        }
    }

    long long nrFact = 1;
    long long suma = 1;
    for(long long i=1;i<=lastI;i++)
    {
        long long h = factori[Prime[i]] + 1;
        nrFact *= h;
        long long c = (pow(Prime[i],h) - 1) / (Prime[i]-1);
        suma *= c;
        factori[i] = 0;
    }
    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;
}