Cod sursa(job #2724222)

Utilizator Victor2006Nicola Victor-Teodor Victor2006 Data 16 martie 2021 19:10:07
Problema Suma si numarul divizorilor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.82 kb
#include <fstream>
#include <iostream>
#define P2 16384
#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 + 2];
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;
    a %= MOD;
    while ( b ) {
        if ( b % 2 == 1 ) {
            ans *= a;
            ans %= MOD;
        }
        a *= a;
        a %= MOD;
        b /= 2;
    }
    return ans;
}

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

int main() {
    ciurMake( N );
    primeMake( N );
    prime[NP + 1] = 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;
}