Cod sursa(job #1955889)

Utilizator CodrutLemeniCodrut Lemeni CodrutLemeni Data 6 aprilie 2017 12:26:57
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.86 kb
#include <iostream>
#include <stdio.h>
#include <stdlib.h>

using namespace std;


const int NCIUR = 1e6 + 5 ;
const int NRPRIMES = 1e5 ;
const int MOD = 9973 ;

long long nrDiv = 1 , sumTot = 1 ;
int viz [ NCIUR ] ;
int primes [ NRPRIMES ] , prcr ;


int CalcFastExp ( int x , int power ){
    static int temp ;

    if ( power == 1 ){
        return x % MOD ;
    }

    temp = CalcFastExp( x , power/2 );

    if ( power % 2 ){
        return ( 1LL * temp * temp * x ) % MOD ;
    }else{
        return ( temp * temp ) % MOD ;
    }

}


void Solve ( long long x ){
    static int i , power ;

    nrDiv = 1 ;
    sumTot = 1  ;

    for ( i = 0 ; 1LL * primes [ i ] * primes [ i ] <= x && i < prcr ; i++){
        power = 0 ;
        while ( x % primes [ i ] == 0 ){
            x/= primes [ i ] ;
            power ++ ;
        }
        if ( power ){
            nrDiv = ( nrDiv * ( power + 1 ) )% MOD ;
            sumTot = sumTot * ( CalcFastExp ( primes [ i ] , power + 1 ) - 1  ) * CalcFastExp( primes [ i ] - 1 , MOD - 2 )    ;
            sumTot %= MOD ;

        }
    }

    if ( x != 1 ){
        nrDiv = ( nrDiv * 2 )% MOD ;
        sumTot = ( 1LL * sumTot * (x + 1)  ) % MOD    ;
    }

    printf("%lld %lld\n",nrDiv , sumTot );
}

int main(){
    int noTest;
    int i , j ;
    long long x ;

    freopen("ssnd.in","r",stdin);
    freopen("ssnd.out","w",stdout);

    for ( i = 2 ; i < NCIUR ; i++ ){
        if ( viz [ i ] ){
            continue ;
        }
        primes [ prcr ++]= i ;

        if ( 1LL * i * i >= NCIUR ){
            continue ;
        }

        for ( j = i * i ; j < NCIUR ; j+=i ){
            viz [ j ] = 1;
        }
    }



    scanf("%d",&noTest );

    while ( noTest-- ){

        scanf("%lld",&x);

        Solve ( x );



    }

    return 0;
}