Cod sursa(job #419154)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 17 martie 2010 01:11:25
Problema Suma divizorilor Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.86 kb
#include<iostream>
#include<string>

using namespace std;

#define NM 1000005
#define MOD 9901
#define LL long long

char ciur[NM];

int primes[NM],dim;

void euclid(int a,int b,int &x,int &y)
{
     if(!b)
     {
          x=1,y=0;
          return ; 
     }
     
     euclid(b,a%b,x,y);
     
     int nx=y,ny=x-(a/b)*y;
     x=nx,y=ny;
}

int invmod(int A,int N)
{
     int x,y;
     
     euclid(A,N,x,y);
     
     while(x<0) x+=N;
     
     return x;
}

int power(int A,int p)
{
    if(!p) return 1;
    
    int half=power(A,p/2);
    
    int ans=(half*half)%MOD;
    if(p%2) ans=(ans*A)%MOD;
    
    return ans;
}

int main()
{
    int q[100],k=0,A,B;
    
    LL p[100];
    
    freopen("sumdiv.in","r",stdin);
    freopen("sumdiv.out","w",stdout);
    
    for(int i=2;i<=1000000;++i)
       if(!ciur[i])
       {
           primes[++dim]=i;
           
           for(int j=2*i;j<=1000000;j+=i)
              ciur[j]=1;        
       }
    
    scanf("%d %d",&A,&B);    
    
    LL nr=A;
        
    for(int i=1;i<=dim && nr>1;++i)
    {
        if((LL)primes[i]*primes[i]>A) break;     
                
        if(nr%primes[i]==0)
        {
            p[++k]=primes[i];
            q[k]=0;
               
            while(nr%primes[i]==0) 
            {
               ++q[k];
               nr/=primes[i];
            }                  
        }  
    } 
        
    if(nr>1)
    {
       p[++k]=nr;
       q[k]=1;    
    }
        
    int sum=1;
  
    for(int i=1;i<=k;++i)
    {   
        int pq=power(p[i],q[i]*B+1);   
        pq--;
        if(pq<0) pq+=MOD;
           
        sum=(sum*pq)%MOD;
           
        int invm=invmod(p[i]-1,MOD);
           
        sum=(sum*invm)%MOD;        
    }   
        
    printf("%d",sum);
    
    return 0;
}