Cod sursa(job #872568)

Utilizator paunmatei7FMI Paun Matei paunmatei7 Data 6 februarie 2013 11:53:40
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
#include<stdio.h>
#include<math.h>
#include<string.h>
#define MOD 9973
long t , a [ 100007 ] , put [ 100007 ] ;
long long n;
bool ap[ 1000007 ];
void ciur ( long n )
{
    a [ ++ a [ 0 ] ] = 2 ;
    for ( int i=4 ; i<=n ; i += 2)
        ap [ i ] = 1;
    for ( int i=3 ; i<=n ; i += 2)
    {
        if ( ap [ i ] == 0 )
        {
            a [ ++ a [ 0 ] ] = i ;
            for ( int j=i*2 ; j<=n ; j += i)
                ap [ j ] = 1;
        }
    }
}
void desc ( long long n )
{
    int d , nr = 0;
    for ( int i=1 ; i<=a [ 0 ] && n != 1 && a [ i ] <= sqrt ( n ) ; ++i )
    {
        nr=0;
        while ( n%a [ i ] == 0)
            n /= a [ i ] , ++nr;
        put [ i ] = nr ;
    }
    if ( n != 1 )
        for ( int i=1 ; i<=a [ 0 ]  ; ++i )
            if ( a [ i ] == n )
            {
                put [ i ] = 1;
                break;
            }
}
int main ( )
{
    long long nrdiv , prod , prod2 , s ;
    freopen ( "ssnd.in" , "r" , stdin ) ;
    freopen ( "ssnd.out" , "w" , stdout ) ;
    scanf ( "%d" , &t ) ;
    ciur ( 1000000 ) ;
    for ( int i=1 ; i<=t ; ++i )
    {
        scanf( "%lld" , &n );
        memset ( put , 0 , sizeof ( put ) ) ;
        desc ( n ) ;
        nrdiv = 1;
        prod2 = 1;
        for( int i=1 ; i<=a [ 0 ] ; ++i )
        {
            if ( put [ i ] != 0 )
            {
                prod = 1 ;
                nrdiv = nrdiv * (put [ i ] + 1);
                s = 0 ;
                for ( int j=0 ; j<= put [ i ] ; ++j )
                {
                    s = (s + prod) % MOD ;
                    prod *= a [ i ] ;
                }
                prod2 = (prod2 * s) % MOD ;
            }
        }
        printf("%lld %lld\n" ,  nrdiv , prod2);
    }
    return 0 ;
}