Cod sursa(job #2596797)

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

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

                 long long int sus=explog(n,2)-1;
                 if(sus<0)
                    sus+=MOD;
                 long long int jos=explog(n-1, MOD-2);
                 if(jos<0)
                    jos+=MOD;
                 sum=((sum%MOD)*(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[i])
               v.push_back(i);

}
long long int  explog(long long int a,long long  int b)
{
  long long int sol=1;
  long long 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;
}