Cod sursa(job #50076)

Utilizator razvi9Jurca Razvan razvi9 Data 6 aprilie 2007 20:06:03
Problema Suma divizorilor Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.94 kb
#include<stdio.h>
#define mod 9901
int a,b,s,c;
int putere(int x,int n)
{if(n==1) return x%mod;
 if(n==0) return 1;
 int p=putere(x,n/2);
 p=(p*p)%mod;
 if(n%2) return (x*p)%mod;
 else return p;}
void euclid(int a,int b,int &d,int &x,int &y)
{if(b==0) 
  {x=1;y=0;d=a;
   return;}
int x0,y0;
euclid(b,a%b,d,x0,y0);
x=y0;
y=x0-(a/b)*y0;
}
int div(int  a,int  b)
{int  d=2,s=1,d1,x,y;
 long long nr=0;
 while(a%d==0) {a=a/d;nr++;}
 nr=nr*b;
 if(nr)
 {nr=putere(d,nr+1);
  nr=(mod+nr-1)%mod;
  s=(s*nr)%mod;}
 d=3;
 while(a!=1)
 {nr=0;
 while(a%d==0) {a=a/d;nr++;}
 nr=nr*b;
 if(nr)
 {nr=putere(d%mod,nr+1);
  nr=(mod+nr-1)%mod;
  euclid(mod,d-1,d1,x,y);
  nr=(nr*y)%mod;
  s=(s*nr)%mod;}
  d=d+2;}
return s;}

int main()
{freopen("sumdiv.in","r",stdin);
 freopen("sumdiv.out","w",stdout);
 scanf("%d %d",&a,&b);
 if(a==1||b==0) printf("1");
 else printf("%d",div(a,b));
 fclose(stdout);
 return 0;}