Cod sursa(job #874549)

Utilizator BarracudaFMI-Alex Dobrin Barracuda Data 8 februarie 2013 19:15:09
Problema Suma divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include<fstream>
#include<bitset>
#define mod 9901
#define lim 100003

using namespace std;

ifstream f("sumdiv.in");
ofstream g("sumdiv.out");
bitset<lim>ok;
long long n,x,i,A,B,j;
long long prim[lim];
long long putere(long long n,long long p){
    long long r=1;
    while(p!=0){
        if(p%2)
            r=(n*r)%mod;
        n=(n*n)%mod;
        p/=2;
    }
    return r;
}
void ciur(){
    prim[-1]=1;
    prim[1]=2;
    for(i=3;i<=lim;i+=2){
        if(!ok[i]){
            prim[++prim[-1]]=i;
            for(j=i+i;j<=lim;j+=i)
               ok[j]=1;
            ok[i]=1;
        }
    }
}
void  sumNRdiv(long long x){
    long long exp,a1,a2,suma;
    suma=1;
   
    for(long long i=1;i<=prim[-1],prim[i]*prim[i]<=x;i++){
        if(x%prim[i]==0){
            exp=0;
            while(x%prim[i]==0){
                exp++;
                x/=prim[i];
            }
            a1=(putere(prim[i],exp*B+1)-1)%mod;
            a2=putere(prim[i]-1,mod-2)%mod;
           
              suma=(((suma*a1)%mod)*a2)%mod;
        }
    }
    if(x!=1){
		
		a1=(putere(x,B+1)-1)%mod;
		a2=putere(x-1,mod-2)%mod;
		
		 suma=(((suma*a1)%mod)*a2)%mod;
    }
   g<<suma<<"\n";
}
int main (){
    f>>A>>B;
    ciur();
	sumNRdiv(A);
    return 0;
}