Cod sursa(job #1386132)

Utilizator Alex1199Alex Bercea Alex1199 Data 12 martie 2015 18:34:31
Problema Suma si numarul divizorilor Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <fstream>
#include <cmath>
using namespace std;
ifstream f("ssnd.in");
ofstream g("ssnd.out");
int64_t n, t, prim[1000001],m=1, nr=1, sum=1;
bool a[1000001];
int64_t sqr(int y){return y*y;}
void ciur()
{
   for(int i=3;i*i<=1000000;i++)
        for(int j=i*i;j<=1000000;j=j+2*i)
          a[j]=true;
   prim[1]=2;
   for(int i=3;i<=1000000;i+=2)
        if(!a[i]) m++,prim[m]=i;
}
int64_t lgput(int64_t x, int64_t a)
{
    if(a==1) return x;
    if(!(a%2)) return sqr(lgput(x,a/2));
      else return x*lgput(x,a-1);
}
int main()
{
    f>>t;
    ciur();
  for(int i=1;i<=t;i++)
  {
    f>>n; int64_t index; int64_t pt=0; nr=sum=1;
    if(n<=1000001 && !a[n]) index=n;
      else if ((int)sqrt(n)>78500) index=78498;
           else index=(int)sqrt(n);
   while (n!=1 && index>0)
   {
       while (!(n%prim[index]) && n!=1)
       {
           pt++; n/=prim[index];
       }
    if(pt) nr*=(pt+1), sum=(sum%9973*((lgput(prim[index],pt+1)-1)/(prim[index]-1))%9973)%9973;
    pt=0; index--;
   }
  g<<nr<<' '<<sum<<'\n';
  }
    return 0;
}