Cod sursa(job #1655051)

Utilizator alex.vasiuVasiu Alexandru alex.vasiu Data 17 martie 2016 18:12:43
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <iostream>
#include <fstream>
#include <cmath>
#include <vector>
using namespace std;
ifstream f("ssnd.in");
ofstream g("ssnd.out");
int nrp[1000005];
int nrrk=0;
int64_t pown(int64_t a,int64_t b,int64_t m)
{
    int64_t p=1;
    while(b)
    {
        if(b%2)
            p=(p*a)%m,b--;
        a=(a*a)%m;
        b/=2;
    }
    return p%m;
}
void gdc(int64_t a,int64_t b,int64_t &x,int64_t &y)
{
    if(!b)
    {
        x=1;
        y=0;
        return;
    }
    else
    {
        int64_t x0,y0;
        gdc(b,a%b,x0,y0);
        x=y0;
        y=x0-y0*(a/b);
    }
}
int64_t inv_modular(int64_t a,int64_t b)
{
    int64_t x,y;
    gdc(a,b,x,y);
    while(x<0)
        x+=b;
     return x;
}
int main()
{
    vector <bool> ciur(1000005);
    ciur[0]=ciur[1]=1;
    for(int i=2;i<1e6+5;i++)
        if(!ciur[i])
            {
                nrp[nrrk++]=i;
                for(int j=i+i;j<1e6+5;j+=i)
                ciur[j]=1;
            }
  int t;
  int64_t x;
  f>>t;
  while(t--)
  {
      int64_t p=1,s=1;
      f>>x;
      for(int i=0;1LL*nrp[i]*nrp[i]<=x;i++)
        if(x%nrp[i]==0)
      {
          int64_t k=1;
          while(x%nrp[i]==0)
            k++,x/=nrp[i],k%=9973;
          p=(p*k)%9973;
         s=(s*(pown(nrp[i],k,9973)-1)*inv_modular(nrp[i]-1,9973)) % 9973;
      }
      if(x>1)
        {
            p*=2;
            s=s*(x+1)%9973;
        }
      g<<p<<" "<<s<<"\n";
  }
}