Cod sursa(job #981679)

Utilizator superman_01Avramescu Cristian superman_01 Data 7 august 2013 18:27:10
Problema Suma divizorilor Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 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;
            //inversul modular , MOD -nr prim => Fermat
            p2 = ( lgput( i -1 , MOD-2) )  % MOD;
            sd = ( ( sd * p1 ) % MOD *p2) % MOD ;
        }
        if( N  > 1   )
        {       
			sd=(sd*(lgput(N,B+1)-1+MOD)%MOD*lgput(N-1,MOD-2))%MOD;
		}
    out << sd <<"\n";
  
    in.close();
    out.close();
    return 0 ;  
}