Cod sursa(job #2189827)

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

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

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

int t;

int Prime[NMAX];
int NP;
bitset <NMAX> v;

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

int pow (int x,int 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;
    fin>>x;
    if (v[x] == 0)
    {
        fout<<2<<' ';
        fout<<x%MOD+1%MOD<<'\n';

        return;
    }

    int nrFact = 1;
    int suma = 1;

    for(int i=1;i<=NP && 1LL*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(int i=0;i<t;i++)
    {
        Solve();
    }

    return 0;
}