Cod sursa(job #2710059)

Utilizator rARES_4Popa Rares rARES_4 Data 21 februarie 2021 18:57:51
Problema Suma si numarul divizorilor Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.55 kb
#include <iostream>
#include <fstream>
#define MOD 9973
using namespace std;
ifstream f ("ssnd.in");
ofstream g ("ssnd.out");
int n,div_primi[1000005],ciur[1000005],cnt_div_primi=1;
void gen_ciur()
{
    for(int i= 2;i*i<=1000001;i++)
    {
        if(ciur[i] == 0)
        {
            div_primi[cnt_div_primi++] = i;
            for(int j = 2 ;i*j<=1000001;j++)
            {
                ciur[i*j] = 1;
            }
        }
    }
}
long long pow(long long b,long long e)
{
    if(e == 0)
        return 1;
    if(e%2 == 1)
    {
        return (b*pow(b,e-1))%MOD;
    }
    return (pow(b,e/2)*pow(b,e/2))%MOD;
}
void query(long long x)
{
    int cnt = 1,e = 0;
    int nr_div = 1,suma_div = 1;
    while(x>1)
    {
        e = 0;
        int div = div_primi[cnt];
        if(x%div == 0)
        {
            while(x%div == 0)
            {
                x/=div;
                e++;
            }
        }
        /// folosim formulele de la indicatii de rez
        nr_div *= (e+1);
        int p1 = (pow(div_primi[cnt], e+1) - 1) % MOD;
        /// un fel de invers modular
		int p2 = pow(div_primi[cnt]-1, MOD-2) % MOD;
		suma_div = (((suma_div*p1)%MOD)*p2)%MOD;
		cnt++;
		if(cnt>cnt_div_primi)
            break;
    }
    if(x>1)
    {
        nr_div*=2;
        suma_div = (1LL * suma_div*(x+1))%MOD;
    }
    g << nr_div<< " "<< suma_div<< '\n';
}
int main()
{
    gen_ciur();
    f >> n;
    for(int i = 1;i<=n;i++)
    {
        long long x;
        f >> x;
        query(x);
    }
}