Cod sursa(job #228463)

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