Cod sursa(job #228452)

Utilizator FlorianFlorian Marcu Florian Data 7 decembrie 2008 12:07:29
Problema Suma divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
#include<stdio.h>
#include<stdlib.h>
#define M 9901
FILE*f=fopen("sumdiv.in","r");
FILE*g=fopen("sumdiv.out","w");
int a,b,P=1;
inline int modulo(int x)
  {
   if(x>=0) return x%M;
   return M - (abs(x)%M);
  }
int putere(int a, int b) //ridic a la puterea b
 {
 int rez=1;
 while(b)
  {
  if(b%2==0)
   {
   a=modulo(a*a);
   b/=2;
   }
  else
   {
   --b;
   rez=modulo(rez*a);
   }
  }
 //if(rez==0) return 9901;
 return rez;
 }
void solve(int n, int b)
 {
 int sol,i,r;
 for(i=2;i*i<=n;++i)
  {
  if(n%i==0)
   {
   for(r=0;n%i==0;++r,n/=i);
   r*=b;
   // calculez i^0 + i^1 + ... + i^r
   sol=modulo((modulo(putere(i,r+1)-1)) * modulo(putere(i-1, 9901-2)));
   P=(P*sol)%M;
   }
  }
 if(n>1)
  {
   r=b;
   // calculez i^0 + i^1 + ... + i^r
   sol=modulo(modulo(putere(n,r+1)-1) * modulo(putere(n-1, 9901-2)));
   P=(P*sol)%M;
  }
 fprintf(g,"%d\n",P);
 }
int main()
 {
 fscanf(f,"%d %d",&a,&b);
 solve(a,b);
 return 0;
 }