Cod sursa(job #1582435)

Utilizator RadduFMI Dinu Radu Raddu Data 27 ianuarie 2016 22:03:25
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 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],div[80005],pw[80005],nrd,ind;

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(p[ind]*p[ind]<=x && ind<=k)
  { put=0;

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

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

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

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

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

int Inv(int a,int b)
{ int i,c,r[30],nr=0,x,y,x2,y2,aux=b;
   a%=mod;
  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;

   for(i=1;i<=nrd;i++)
    ans1*=pw[i]+1;

   for(i=1;i<=nrd;i++)
    {ans2=1LL*ans2*(LgPut(div[i],pw[i]+1)-1)*Inv(div[i]-1,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;
}