Cod sursa(job #2586214)

Utilizator Florinos123Gaina Florin Florinos123 Data 19 martie 2020 23:36:15
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <fstream>

using namespace std;

ifstream f ("ssnd.in");
ofstream g ("ssnd.out");

int t;
int k, prime[80005];
bool ciur[1000005];
const int mod = 9973;

void Eratosthene ()
{
   for (int i=2; i<=1000000; i++)
   {
       if (ciur[i] == 0)
       {
           k ++, prime[k] = i;
           for (int j=i+i; j<=1000000; j+=i)
             ciur[j] = 1;
       }
   }
}

int RidicareLog (int n, int p)
{
    int rez = 1;

    while (p)
    {
        if (p % 2 == 1)
          rez = (1LL * rez * n) % mod;
        n = (1LL *n * n) % mod;
        p /= 2;
    }

    return rez;
}

void Solve (long long n)
{
   int nrdiv = 1;
   int sumdiv = 1;

   for (int i=1; 1LL * prime[i]*prime[i] <= n && i <= k; i++)
   {
       int p = 0;
       while (n % prime[i] == 0)
       {
           n /= prime[i];
           p ++;
       }

       if (p > 0)
       {
           nrdiv = (1LL * nrdiv * (p + 1)) % mod;
           int p1 = (RidicareLog(prime[i], p+1) - 1) % mod;
           int p2 = (RidicareLog(prime[i]-1, mod-2)) % mod;
           sumdiv = (1LL *((sumdiv * p1) % mod) * p2) % mod;
       }
   }

   if (n > 1)
   {
       nrdiv = (1LL * nrdiv * 2) % mod;
       sumdiv = (1LL * sumdiv * (n + 1) % mod);
   }

   g << nrdiv << " " << sumdiv << "\n";
}

int main()
{
  Eratosthene();
  f >> t;
  for (int i=1; i<=t; i++)
  {
      long long val;
      f >> val;
      Solve(val);
  }
    return 0;
}