Cod sursa(job #2565361)

Utilizator serafimalex2001Serafim Alex serafimalex2001 Data 2 martie 2020 13:52:11
Problema Suma si numarul divizorilor Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.77 kb
#include <iostream>
#include <fstream>
using namespace std;

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

int t;

const int MOD = 9973;

bool c[1000050];
int prime[100090];
int nr_prime;

void Ciur()
{
    int i,j;
    c[2] = true;
    for(i = 3; i<=1000050; i+=2 )
        c[i] = true;
    for( i = 3; i*i <= 1000050; i+=2)
        if(c[i] == true)
            for(j = 3*i; j<=1000050; j+=2*i)
                c[j] = false;
    prime[++nr_prime] = 2;
    for(i = 3; i<=1000050; i+=2)
        if(c[i] == true)
            prime[++nr_prime] = i;
}

long long Exp(int n, int p)
{
    if(p == 0)
        return 1;
    if(p%2 == 0)
    {
        long long P = Exp(n,p/2)%MOD;
        return P*P%MOD;
    }
    else
    {
        long long P = Exp(n,p/2)%MOD;
        return P*P%MOD*n%MOD;
    }
}

long long invers(long long x)
{
    return Exp(x,MOD-2)%MOD;
}

void Do(long x)
{
    int i,j;
    long long power;
    long long inv;
    long long sum = 1;
    long long total_div = 1;
    int ct, d = 2;
    int nr = 0;
    if(c[x] == true)
    {
        fout<<2<<" "<<x+1<<"\n";
        return;
    }
    while(x > 1)
    {
        d = prime[++nr];
        ct = 0;
        while(x % d == 0)
        {
            ct++;
            x/=d;
        }
        if(ct > 0)
        {
            total_div = total_div*(ct+1)%MOD;
            power = Exp(d,ct+1)-1;
            inv = Exp(d-1, MOD-2)%MOD;
            power = power*inv%MOD;
            sum = sum*power%MOD;
        }
    }
    fout<<total_div<<" "<<sum<<"\n";
}

void Read()
{
    int i,j;
    long long x;
    fin>>t;
    for(i=1; i<=t; ++i)
    {
        fin>>x;
        Do(x);
    }
}

int main()
{
    Ciur();
    Read();
    return 0;
}