Cod sursa(job #1892742)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 25 februarie 2017 11:26:10
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <bits/stdc++.h>
using namespace std;

fstream in ( "ssnd.in" , ios::in  );
fstream out( "ssnd.out", ios::out );

const int CNS = 1000005;
const int MOD = 9973;

bitset<CNS> mrk;
vector<int> prm;

int lgp( int x, int y ) {
    if( y == 0 )
        return 1;
    
    int z = lgp( x, y / 2 );
    
    if( y % 2 != 2 )
        z = ( z * z ) % MOD;
    if( y % 2 == 1 )
        z = ( z * 1LL * x ) % MOD;

    return z;
}

int main( void ) {
    ios::sync_with_stdio( false );

    mrk[0] = mrk[1] = true;
    for( int i = 2; i < CNS; i ++ ) {
        if( mrk[i] == false ) {
            prm.push_back( i );
            
            for( int j = i + i; j < CNS; j += i )
                mrk[j] = true;
        }
    }
    
    int n;
    in >> n;
    
    for( int i = 1; i <= n; i ++ ) {
        long long x;
        in >> x;
        
        int ans1 = 1, ans2 = 1;
        for( int p : prm ) {
            if( p * 1LL * p > x )
                break;
            if( x % p != 0 )
                continue;
            
            int val = p, nr = 1;
            while( x % p == 0 ) {
                val = ( val * 1LL * p ) % MOD;
                x /= p; nr ++;
            }
            
            ans1 *= nr;
            ans2 = ( ans2 * 1LL * ( ( val - 1 + MOD ) % MOD ) * lgp( p - 1, MOD - 2 ) ) % MOD;
        }
        
        if( x != 1 ) {
            ans1 *= 2;
            ans2 = ( ans2 * 1LL * ( ( x * 1LL * x - 1 ) % MOD ) * lgp( int( x - 1 ), MOD - 2 ) ) % MOD;
        }
            
        out << ans1 << " " << ans2 << "\n";
    }
    
    return 0;
}