Cod sursa(job #981579)

Utilizator superman_01Avramescu Cristian superman_01 Data 7 august 2013 15:51:40
Problema Suma divizorilor Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include<fstream>
#include<algorithm>
#include<utility>
#include<bitset>
 
#define MAX_N 1000005
#define MOD 9973
 
using namespace std;
 
ifstream in("sumdiv.in");
ofstream out("sumdiv.out");
 

long long N,B;
bitset < MAX_N > ciur;
int divi[MAX_N],nr;
 
void MakeEratosthene ( void )
{
    int i , ii  ;
    for( i = 2 ; i <= MAX_N ; ++i )
        if( ciur[i] == false )
    {
       divi[++nr] = i ; 
     for( ii = i + i ; ii <= MAX_N ; ii+=i )
         ciur[ii] = true ;
    }
}
int lgput ( int a , int b )
{
    int rez =1 ;
    a%=MOD;
    while ( b )
    {
        if( b % 2 == 1 )
            rez = ( rez *a ) % MOD;
    a =  ( a*a) % MOD;
    b = b /2;
    }
    return rez;
}
 
 
int main ( void )
{
    int i , j;
    MakeEratosthene();
    in>>N>>B ;
        int nd = 1 , sd = 1  , p1 , p2 ;
        for( i = 1 ; i <= nr && (long long) divi[i]*divi[i] <= N; ++i )
        {
            if( N % divi[i] )
                continue ;
            int p = 0 ;
            while(  N % divi[i] == 0 )
            {
                N /= divi[i];
                ++p;
            }
			p *= B;
            p1 = ( lgput( divi[i], p+1) -1 ) % MOD;
            //inversul modular , MOD -nr prim => Fermat
            p2 = ( lgput( divi[i] -1 , MOD-2) )  % MOD;
            sd = ( ( sd * p1 ) % MOD *p2) % MOD ;
        }
        if( N  == 2  )
        {       
             sd = 15 ;			
        }
		else
			if(  N > 1)
		{
			  sd=(sd*(lgput(N,B+1)-1)%MOD*lgput(N-1,MOD-2))%MOD;
		}
    out << sd <<"\n";
  
    in.close();
    out.close();
    return 0 ;  
}