Cod sursa(job #318617)

Utilizator Magnuscont cu nume gresit sau fals Magnus Data 28 mai 2009 20:13:01
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <cstdio>   
  
#define file_in "sumdiv.in"   
#define file_out "sumdiv.out"   
#define Nmax 10
#define prim 9901   
#define ll long long   
#define ii inline   
  
ll x,y;   
ll a[Nmax];   
ll b[Nmax];   
ll sol,nr=0,p,xx;   
  
  
  
ii ll put(ll x, ll y)    
{   
    ll p=1,k;   
    for (k=y;k>0;k>>=1)    
    {   
        if (k%2==1)    
            p=(p*x)%prim;   
        x=(x*x)%prim;   
    }   
    return p;   
}   
  
  
  
ii void div()   
{   
    ll i;   
    for (i=2;i*i<=x;++i)   
    {   
        if (x%i==0)   
        {   
        nr++;   
        a[nr]=i;   
        while(x%i==0)   
        {   
            x/=i;   
            ++b[nr];   
        }   
        }   
    }   
    if (x!=1)   
    {   
        nr++;   
        a[nr]=x;   
        b[nr]=1;   
    }   
}   
  
  
  
ii void citire()   
{   
    freopen(file_in,"r",stdin);   
    freopen(file_out,"w",stdout);   
  
    scanf("%lld %lld", &x,&y);   
}   
  
ii void solve()   
{   
    ll i;   
    div();   
    sol=1;   
    for (i=1;i<=nr;++i)   
    {   
        b[i]=b[i]*y;   
        if (a[i]%prim==1)   
        {   
            p=b[i]+1;   
        }   
        else   
        {   
            p=(put(a[i],b[i])*a[i]+prim-1)%prim;   
            p=(p*put(a[i]-1,prim-2)%prim)%prim;   
        }   
        sol=(sol*p)%prim;   
    }   
}   
  
ii void scrie()   
{   
    printf("%lld", sol);   
}   
  
int main()   
{   
    citire();   
    solve();   
    scrie();   
  
  
    fclose(stdin);   
    fclose(stdout);   
  
    return 0;   
}