Cod sursa(job #2756467)

Utilizator Tudor06MusatTudor Tudor06 Data 31 mai 2021 20:38:06
Problema Suma si numarul divizorilor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <iostream>
#include <fstream>

using namespace std;

const int MOD = 9973;
const int NMAX = 1000000;
char ciur[NMAX + 1];
int prime[80000];

void calc_prime() {
    int i, j, prim = 0;
    ciur[0] = ciur[1] = 1;
    for ( i = 2; i * i <= NMAX; i ++ ) {
        if ( ciur[i] == 0 ) {
            for ( j = i * i; j <= NMAX; j += i )
                ciur[j] = 1;
        }
    }
    for ( i = 0; i < NMAX; i ++ ) {
        if ( ciur[i] == 0 ) {
            prime[prim++] = i;
        }
    }
}
int lgput( int a, int b ) {
    int p = 1;
    while ( b > 0 ) {
        if ( b % 2 == 1 ) {
            p = (long long)p * a % MOD;
        }
        a = (long long)a * a % MOD;
        b /= 2;
    }
    return p;
}
void raspuns( int& suma, int& div, long long a ) {
    int power, d, prim;
    prim = 1;
    d = prime[0];
    div = 1;
    suma = 1;
    while ( d * d <= a ) {
        power = 0;
        while ( a % d == 0 ) {
            a /= d;
            power ++;
        }
        div *= ( power + 1 );
        if ( power > 0 ) {
            suma = (long long)suma * ( lgput( d, power + 1 ) - 1 ) % MOD * lgput( d - 1, MOD - 2 ) % MOD;
        }
        suma %= MOD;
        d = prime[prim++];
    }
    if ( a > 1 ) {
        div *= 2;
        suma = (long long)suma * ( lgput( a, 2 ) - 1 ) % MOD * lgput( a - 1, MOD - 2 ) % MOD;;
    }
}
int main() {
    ifstream fin( "ssnd.in" );
    ofstream fout( "ssnd.out" );
    int t, i, suma, div;
    long long n;
    fin >> t;
    calc_prime();
    for ( i = 0; i < t; i ++ ) {
        fin >> n;
        suma = div = 1;
        raspuns( suma, div, n );
        fout << div << ' ' << suma << '\n';
    }
    return 0;
}