Cod sursa(job #462556)

Utilizator BitOneSAlexandru BitOne Data 11 iunie 2010 15:16:13
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.83 kb
#include <vector>
#include <cstdlib>
#include <fstream>
#define MAX_N 1000003
#define Modulo 9973

/*
 *
 */
using namespace std;
typedef pair< int, int > pr;
char isPrime[MAX_N];
vector< int > PrimeNr;
inline int pow( int p, int k )
{
    int r;
    for( r=1; k; k>>=1 )
    {
        if( k&1 )
        {
            r=(1LL*r*p)%Modulo;
            --k;
        }
        p=(1LL*p*p)%Modulo;
    }
    return r;
}
void SieveE( void )
{
    int i, j, pas;
    for( i=1; ((i*i)<<1)+(i<<1) < MAX_N; ++i )
        if( 0 == ( isPrime[i>>3] & (1<<(i&7)) ) )
        {
            pas=(i<<1)+1;
            for( j=((i*i)<<1)+(i<<1); j<<1 < MAX_N; j+=pas )
                isPrime[j>>3]|=1<<(j&7);
        }
    PrimeNr.push_back(2);
    for( i=3; i <= MAX_N; i+=2 )
    {
        j=(i-1)>>1;
        if( 0 == ( isPrime[j>>3] & (1<<(j&7)) ) )
            PrimeNr.push_back(i);
    }
}
int main( void )
{
    long long int A;
    int T, i, j, nr, s;
    SieveE();
    ifstream in( "ssnd.in" );
    ofstream out( "ssnd.out" );
    for( in>>T; T; --T )
    {
        in>>A;
        if( A <= MAX_N &&  A%2 && A%3 && A%5 && A%7  )
        {
            i=(A-1)>>1;
            if( 0 ==  ( isPrime[i>>3] & (1<<(i&7)) ) )
            {
                out<<"2 "<<(A+1)<<'\n';
                continue;
            }
        }
        nr=s=1;
        for( i=0; 1LL*PrimeNr[i]*PrimeNr[i] <= A; ++i )
            if( 0 == A%PrimeNr[i] )
            {
                for( j=0; 0 == A%PrimeNr[i]; A/=PrimeNr[i], ++j );
                nr=(1LL*nr*(j+1) )%Modulo;
                s=( 1LL*s*( pow( PrimeNr[i], j+1 )-1 )*pow( PrimeNr[i]-1, Modulo-2 ) )%Modulo;
            }
        if( A > 1 )
            nr=(2*nr)%Modulo, s=( 1LL*s*(A+1) )%Modulo;
        out<<nr<<' '<<s<<'\n';
    }
    return EXIT_SUCCESS;

}