Cod sursa(job #2722720)

Utilizator Victor2006Nicola Victor-Teodor Victor2006 Data 13 martie 2021 11:28:18
Problema Suma si numarul divizorilor Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.67 kb
#include <fstream>
#define P2 16
#define MOD 9973
#define N 1000000
#define NP 499502

using namespace std;

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

char ciur[N + 1];
int prime[NP + 1];
int np = 1;

void ciurMake( long long n ) {
    for ( int i = 4; i <= n; i += 2 ) {
        ciur[i] = 1;
    }
    for ( int i = 3; i * i <= n; i += 2 ) {
        if ( !ciur[i] ) {
            for ( int d = i * i; d <= n; d += i ) {
                ciur[d] = 1;
            }
        }
    }
}

void primeMake( int n ) {
    prime[np ++] = 2;
    for ( int i = 3; i <= n; i += 2 ) {
        if ( !ciur[i] ) {
            prime[np ++] = i;
        }
    }
}

int putAB( int a, int b ) {
    int ans = 1;
    while ( b ) {
        if ( b % 2 == 1 )
            ans = ( ans * a ) % MOD;
        a = ( a * a ) % MOD;
        b /= 2;
    }
    return ans;
}

int sumSiNr( long long n ) {
    int put, nr = 1, sum = 1, poz = 1;
    while ( prime[poz] * prime[poz] <= n ) {
        put = 0;
        while ( n % prime[poz] == 0 ) {
            put ++;
            n /= prime[poz];
        }
        nr *= ( put + 1 );
        if ( put >= 1 )
            sum *= ( ( putAB( prime[poz], put + 1 ) - 1 ) / ( prime[poz] - 1 ) ) % MOD;
        poz ++;
    }
    if ( n > 1 ) {
        nr *= 2;
        sum *= ( ( n * n - 1 ) / ( n - 1 ) ) % MOD;
    }
    return sum * P2 + nr;
}

int main() {
    ciurMake( N );
    primeMake( N );
    int n, ans;
    long long nr;
    fin >> n;
    for ( int i = 1; i <= n; i ++ ) {
        fin >> nr;
        ans = sumSiNr( nr );
        fout << ans % P2 << " " << ans / P2 << "\n";
    }
    return 0;
}