Cod sursa(job #1566192)

Utilizator Darius15Darius Pop Darius15 Data 11 ianuarie 2016 20:42:18
Problema Suma divizorilor Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <fstream>
#include <bitset>
using namespace std;
ifstream f("sumdiv.in");
ofstream g("sumdiv.out");
int a,pr=1,b,mod=9901,pow,j,e[8001],put,ans,prim[8001],l,i;
bitset <8001> viz;
int main()
{
    f>>a>>b;
    if (b==0 && a==0) g<<0;
    else if (b==0) g<<1;
    else{
    prim[l=1]=2;
    for (i=3;i<=8000;i+=2)
      if (viz[i]==false)
    {
      prim[++l]=i;
         for (j=i*i;j<=8000;j+=i)
          viz[j]=true;
    }
    for (i=1;i<=l && prim[i]*prim[i]<=a;i++)
    if (a%prim[i]==0) {
    while(a%prim[i]==0)
    e[i]++,a/=prim[i];
    }
    for (i=1;i<=l;i++)
    if (e[i]!=0) e[i]=e[i]*b,e[i]++;
    for (i=1;i<=l;i++)
      if (e[i]!=0)
    {
      put=prim[i];
      ans=1;
      for (j=0;(1<<j)<=e[i];j++)
      {
        if (e[i] & (1<<j))
          ans*=put,ans%=mod;
          put=put*put;
          put%=mod;
      }
      ans--;
      pr*=ans;
      pr%=mod;
      put=prim[i]-1;
      ans=1;
      for (j=0;(1<<j)<=(mod-2);j++)
      {
        if ((mod-2) && (1<<j))
          ans*=put,ans%=mod;
        put=put*put;
        put%=mod;
      }
      pr*=ans;
      pr%=mod;
    }
    if (a>1) {
      pow=b+1;
      put=a;
      ans=1;
      for (j=0;(1<<j)<=pow;j++){
        if (pow & (1<<j))
          ans*=put,ans%=mod;
        put=put*put;
        put%=mod;
      }
      ans--;
      pr*=ans;
      pr%=mod;
      ans=1;
      put=a-1;
      for (j=0;(1<<j)<=(mod-2);j++)
      {
        if ((mod-2) & (1<<j))
          ans*=put,ans%=mod;
        put=put*put;
        put%=mod;
      }
      pr*=ans;
      pr%=mod;
    }
    g<<pr;
    }
    return 0;
}