Cod sursa(job #2529007)

Utilizator Tudor06MusatTudor Tudor06 Data 22 ianuarie 2020 20:50:42
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 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;
        }
    }
}
void raspuns( int *suma, int *div, long long a ) {
    int power, d, prim;
    long long prod;
    prim = 1;
    d = prime[0];
    while ( d * d <= a ) {
        power = 0;
        prod = 1;
        while ( a % d == 0 ) {
            prod *= d;
            a /= d;
            power ++;
        }
        *div *= ( power + 1 );
        if ( prod != 1 ) {
            *suma *= ( prod * d - 1 ) / ( d - 1 ) % MOD;
        }
        *suma %= MOD;
        d = prime[prim++];
    }
    if ( a > 1 ) {
        *div *= 2;
        *suma *= ( a * a - 1 ) / ( a - 1 ) % MOD;
        *suma %= 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;
}