Cod sursa(job #2596786)

Utilizator smoc_georgemarianSmoc George-Marian smoc_georgemarian Data 10 aprilie 2020 13:47:13
Problema Suma si numarul divizorilor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 kb
#include <bits/stdc++.h>
#define NMAX 100009
#define MOD 9973
using namespace std;
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");
int t;
int n;
vector<int>v;
bool uz[NMAX];
void ciur();

int  explog(int a, int b);
int main()
{fin>>t;
ciur();
fout<<explog(2,3)<<" ";
 while(t--)
        {
        fin>>n;
        int nrd=1;
        long long int sum=1;
        for(int i=0;i<v.size() && v[i]* v[i]<=n;i++)
            {
              int it=v[i];
              int cate=0;
              while (n%it==0)
                {
                 cate++;
                 n/=it;
                }
              nrd=nrd*(cate+1);
              if(cate)
                  {int sus=explog(it,cate+1)-1;
                   int jos=explog(it-1, MOD-2);
                   sum=(sum*(1ll*sus*jos)%MOD)%MOD;
                  }
            }
          if(n!=1)
                {nrd*=2;

                 int sus=explog(n,2)-1;
                 int jos=explog(n-1, MOD-2);
                 sum=(sum*(sus*jos)%MOD)%MOD;
                }
         fout<<nrd<<" "<<sum<<'\n';
        }
    return 0;
}
void ciur()
{
    int i,j;
    for(i=2;i*i<NMAX;i++)
        if(!uz[i])
        for(j=i*i;j<NMAX;j+=i)
            uz[j]=1;
for(i=2;i<NMAX;i++)
            if(!uz[NMAX])
               v.push_back(i);

}
int  explog(int a, int b)
{
  int sol=1;
  int j;
  if(a>MOD)
     a=a%   MOD;
  for(j=0;(1<<j)<= b;j++)
    {
     if( b& (1<<j))
         sol=(sol*a)%MOD;
     a=(a*a)% MOD;
    }
 return sol;
}