Cod sursa(job #1955997)

Utilizator CodrutLemeniCodrut Lemeni CodrutLemeni Data 6 aprilie 2017 13:36:21
Problema Suma divizorilor Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <iostream>
#include <stdio.h>
#include <stdlib.h>

using namespace std;

const int MOD = 9901 ;

int CalcFastExp ( int x , int power ){
    static int temp ;

    if ( power == 1 ){
        return x % MOD ;
    }

    temp = CalcFastExp( x , power /2 );

    temp = ( temp * temp )% MOD ;

    if ( power % 2 ){
        return (temp * x )% MOD  ;
    }
    return temp ;
}

int main(){
    int a , b , power , i ;
    int sumDiv = 1 ;

    freopen("sumdiv.in","r",stdin);
    freopen("sumdiv.out","w",stdout);

    scanf("%d%d",&a ,&b );

    for ( i = 2 ; i * i <= a ; i++ ){

        power = 0 ;
        while ( a % i == 0 ){
            a/=i ;
            power ++ ;
        }

        if ( power ){
            sumDiv = sumDiv * ( CalcFastExp ( i , power * b + 1 ) - 1 ) * CalcFastExp( i - 1 , MOD - 2 );
            sumDiv %= MOD ;
        }
    }

    if ( a != 1){
        if ( a % MOD == 1){
            sumDiv = ( sumDiv * ( a + 1 ) ) %MOD ;
        }else{
            sumDiv = ( sumDiv * ( CalcFastExp( a ,  b + 1 ) - 1 ) )% MOD ;
            sumDiv = sumDiv * CalcFastExp( a-1 , MOD - 2 ) ;
            sumDiv %= MOD ;
        }

    }

    while( sumDiv < 0 ){
        sumDiv += MOD ;
    }

    printf("%d",sumDiv );

    return 0;
}