Cod sursa(job #981694)

Utilizator superman_01Avramescu Cristian superman_01 Data 7 august 2013 18:51:40
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include<fstream>
#include<algorithm>
#include<utility>
#include<bitset>
   
#define MAX_N 1000005
#define MOD 9901
   
using namespace std;
   
ifstream in("sumdiv.in");
ofstream out("sumdiv.out");
   
  
long long N,B;
bitset < MAX_N > ciur;
int divi[MAX_N],nr;
   
  
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;
      
    in>>N>>B ;
        int nd = 1 , sd = 1  , p1 , p2 ;
        for( i = 2 ; i*i <= N; ++i )
        {
            if( N % i )
                continue ;
            int p = 0 ;
            while(  N % i == 0 )
            {
                ++p;
                N /= i;
            }
            p *= B;
			
            p1 = ( lgput( i, p+1) -1 + MOD ) % MOD;
            //inversul modular , MOD -nr prim => Fermat
            p2 = ( lgput( i -1 , MOD-2) )  % MOD;
            sd = ( ( sd * p1 ) % MOD *p2) % MOD ;
        }
        if( N  > 1   )
			if( N % MOD != 1 )
        {       p1 = (lgput(N,B+1)-1+MOD)%MOD ;
		        p2 = lgput(N-1,MOD-2);
            sd=((sd*p1)%MOD*p2)%MOD;
        }
		else
			sd = ( sd * (B+1) ) % MOD;
    out << sd <<"\n";
    
    in.close();
    out.close();
    return 0 ;  
}