Cod sursa(job #1060921)

Utilizator ctlin04UAIC.VlasCatalin ctlin04 Data 18 decembrie 2013 21:39:00
Problema Suma divizorilor Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include<fstream>
using namespace std;
const long long mod=9901;
long long a,b,fact[50],exp[50],nrf,i;

void factorizeaza(long long x) {
     long long p=2;
     if (x%p==0) {
                 ++nrf; fact[nrf]=p;
                 while (x%p==0) { ++exp[nrf]; x/=p; }
                 }
     ++p;
     while (p*p<=x) 
      if (x%p!=0) p+=2;
       else {
             ++nrf; fact[nrf]=p;
             while (x%p==0) { ++exp[nrf]; x/=p; }
             p+=2;
             }
     if (x>1) { ++nrf; exp[nrf]=1; fact[nrf]=x; }
}

int pow(long long x, long long y) {
    long long rez=1;
    while (y>0) 
     if (y%2==0) { x=(x*x)%mod; y/=2; }
     else { rez=(rez*x)%mod; --y; }
    return(rez);
}

void euclid(long long &a,long long &b, long long x, long long y) {
     if (y==0) { a=1; b=0; }
      else {
           long long ao,bo;
           euclid(ao,bo,y,x%y);
           a=bo;
           b=(ao-(x/y)*bo+mod)%mod;
           }
}

int inv(long long x) {
    long long a,b;
    euclid(a,b,x,mod);
    return(a);
}

int main(void) {
    ifstream fin("sumdiv.in");
    ofstream fout("sumdiv.out");
    
    fin>>a>>b;
    
    factorizeaza(a);
    
    for (i=1; i<=nrf; ++i) exp[i]*=b;
    long long rez=1;
    for (i=1; i<=nrf; ++i)
    if (fact[i]%mod==1) rez=(rez*(exp[i]+1))%mod;
     else rez=(rez* ((pow(fact[i],exp[i]+1)+mod-1)%mod * inv(fact[i]-1))%mod )%mod;
    fout<<rez%mod;
 return(0);
}