Cod sursa(job #2338682)

Utilizator Andrei-27Arhire Andrei Andrei-27 Data 7 februarie 2019 18:27:56
Problema Suma si numarul divizorilor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include <bits/stdc++.h>
#define pb push_back
#define  MOD 9973
using namespace std ;
const int NR = 1000005 ;
ifstream in ("ssnd.in") ;
ofstream out ("ssnd.out") ;
bitset < NR > v ;
vector < int64_t > primes ;
int64_t lgpow ( int64_t x , int64_t y )
{
    if ( y == 1 )   return x ;
    if ( y % 2 )    return ( x * lgpow( ( x * x ) % MOD , y >> 1 ) ) % MOD ;
    else            return lgpow ( ( x * x ) % MOD , y >> 1 ) ;
}
void ciur ()
{
    primes .pb ( 2 ) ;
    for( int i = 4 ; i <= NR ; i += 2 ) v [ i ] = 1 ;
    for ( int i = 3 ; i <= NR ; ++ i )
    {

        if ( !v [ i ] )
        {
            primes .pb ( i ) ;
            for ( int j = i * 3 ; j <= NR ; j += 2 * i )
            v [ j ] = 1 ;
        }
    }
}
void work ( int64_t n , int64_t & sum , int64_t & nr )
{
    int64_t i = 0 , nrdiv = 1 , cnt = 1 , divpow = 1 , sumup = 1 , sumdown = 1 ;
    while (  n != 1 )
    {
        cnt = 1 ;
        divpow = 1 ;
        while ( !( n % primes [ i ] ) ) ++ cnt , n /= primes [ i ] , divpow *= primes [ i ] ;
        if ( cnt != 1 )
        sumup = sumup * ( ( divpow * primes [ i ] - 1 ) % MOD ) % MOD  , sumdown = sumdown * ( primes [ i ] - 1 ) % MOD ;
        nrdiv = nrdiv * cnt % MOD ;
        ++ i ;
    }
    nr = nrdiv ;
    sum = sumup * lgpow ( sumdown , MOD - 2 ) % MOD ;
}
int  main ()
{
    ciur() ;
    int q ; in >> q ;
    while ( q -- )
    {
        int64_t  n , sum , nr ; in >> n ;
        work ( n , sum , nr ) ;
        out << nr << ' ' << sum << '\n' ;
    }

    return 0 ;
}