Cod sursa(job #1582501)

Utilizator RadduFMI Dinu Radu Raddu Data 27 ianuarie 2016 23:08:43
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <iostream>
#include <fstream>
#define ll long long
#define pmax 1000000
#define mod 9973
using namespace std;
ifstream f("ssnd.in");
ofstream g("ssnd.out");
bool ok[1000005];
int k,p[80005],pw[80005],nrd,ind;
ll dv[80005];

void GenPrimes()
{ int i,j;
 for(i=3;i*i<=pmax;i+=2)
  if (!ok[i])
  {for(j=i*i;j<=pmax;j+=2*i)
    ok[j]=1;
  }
 k=1; p[k]=2;

 for(i=3;i<=pmax;i+=2)
  if (!ok[i]) {k++; p[k]=i;}
}

void Desc(ll x)
{ int i,put=0;
nrd=0; ind=1;

  while(1LL*p[ind]*p[ind]<=x && ind<=k)
    { put=0;

   while(x%p[ind]==0)
   { put++;
       x/=p[ind];
    }

   if (put) {nrd++; pw[nrd]=put; dv[nrd]=p[ind];}
    ind++;
   }

   if (x>1) {nrd++; pw[nrd]=1; dv[nrd]=x;}
}

int LgPut(int a,int b)
{ int i,add=a,res=1;

   for(i=0;i<=35;i++)
    {if (b&(1LL<<i)) res=1LL*res*add%mod;
     add=1LL*add*add%mod;
     }
   return res;
}

int Inv(int a,int b)
{ int i,c,r[35],nr=0,x,y,x2,y2,aux=b;

  while(b)
  { c=a%b; nr++; r[nr]=a/b;
   a=b; b=c;
  }
  x=1; y=0;

  for(i=nr;i>=1;i--)
  { x2=y; y2=x-y*r[i];
    x=x2; y=y2;
  }
  while(x<0) x+=aux;

  return x;
}
void Solve(ll x)
{ int i,ans1=1,ans2=1;
  if (x<=1) {g<<x<<" "<<x<<"\n"; return;}
  for(i=1;i<=nrd;i++)
   {ans1=1LL*ans1*(pw[i]+1)%mod;
    ans2=1LL*(1LL*ans2*(LgPut(dv[i]%mod,pw[i]+1)-1+mod)%mod)*Inv((dv[i]-1)%mod,mod)%mod;

    }

 g<<ans1<<" "<<ans2<<"\n";
}
int main()
{ int i,t; ll x;
    f>>t;
    GenPrimes();

    for(i=1;i<=t;i++)
    { f>>x;
      Desc(x);
      Solve(x);
    }
    return 0;
}