Cod sursa(job #1566093)

Utilizator DrumeaVDrumea Vasile DrumeaV Data 11 ianuarie 2016 19:49:47
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include <stdio.h>
#include <string.h>
#include <vector>
#include <algorithm>

using namespace std;

typedef long long ll;

const ll Mx = 1e6 + 7;
const int mod = 9973;

int t;
ll n;
bool prime[Mx];
vector< int > prm;

void primes()
{
    memset(prime,1,sizeof(prime));
    prime[1] = 0;
    prm.push_back(2);

    for (int i = 4;i < Mx;i += 2)
        prime[i] = 0;

    for (int i = 3;i < Mx;i += 2)
        if (prime[i])
        {
            prm.push_back(i);

            for (int j = 2 * i;j < Mx;j += i)
                prime[j] = 0;
        }
}

int power(int x,int y)
{
    int ans = 1;

    for (;y;y /= 2)
    {
        if (y % 2)
           ans = (ans * x) % mod;

        x = (x * x) % mod;
    }

    return ans;
}

int main()
{
    freopen("ssnd.in","r",stdin);
    freopen("ssnd.out","w",stdout);

     scanf("%lld",&t);
     primes();

     int m = prm.size();

     for (;t;t--)
     {
         scanf("%lld",&n);
         int nr = 1;
         ll sum = 1;

         for (int i = 0;i < m && ll(prm[i] * prm[i]) <= n;i++)
         {
             int aux = prm[i],cnt = 0;

             if (n % aux)
                continue;

             while (n % aux == 0)
                   cnt++,n /= aux;

             nr = nr * (cnt + 1);

             int x = (power(aux,cnt + 1) - 1) % mod,
                 y = (power(aux - 1,mod - 2)) % mod;

             sum = (((1LL * sum * x) % mod) * y) % mod;
         }

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

         printf("%d %d\n",nr,sum);
     }

  return 0;
}