Cod sursa(job #901635)

Utilizator SteveStefan Eniceicu Steve Data 1 martie 2013 11:01:54
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.95 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <cmath>
#include <iomanip>
#include <string>
#include <cstring>
#include <deque>
#include <stack>
#include <bitset>
#include <list>
#define pb push_back
#define pf push_front
#define pob pop_back
#define pof pop_front
#define mp(a,b) make_pair (a, b)
#define ll long long
#define max(a, b) (a > b ? a : b)
#define min(a, b) (a < b ? a : b)

using namespace std;

unsigned int ciur[31261];
vector <int> prime;

inline bool Get_Bit (unsigned int K)
{
    return (ciur[K >> 5] & (1 << (K & 31)));
}

inline void Put_Bit (unsigned int K)
{
    ciur[K >> 5] |= (1 << (K & 31));
}

void Precalc ()
{
    prime.pb (2);
    for (unsigned int i = 3; i < 1000001; i += 2)
    {
        if (!Get_Bit (i))
        {
            prime.pb (i);
            for (unsigned int j = i * i; j <= 1000001; j += i)
                Put_Bit (j);
        }
    }
}

inline ll Calc (int prim, int nr_div)
{
    ll dog = pow (prim, nr_div) - 1;
    return dog / (prim - 1);
}

int main ()
{
    int T;
    ll N;
    Precalc ();
    ifstream fin ("ssnd.in");
    ofstream fout ("ssnd.out");
    fin >> T;
    for (; T; T--)
    {
        fin >> N;
        int divizori = 1;
        ll suma = 1;
        for (int i = 0; 1LL * prime[i] * prime[i] <= N; i++)
        {
            if (!(N % prime[i]))
            {
                int nr_div = 1;
                while (!(N % prime[i]))
                {
                    nr_div++;
                    N /= prime[i];
                }
                divizori *= nr_div;
                suma *= Calc (prime[i], nr_div);
            }
        }
        if (N > 1)
        {
            divizori <<= 1;
            suma *= Calc (N, 2);
        }
        fout << divizori << " " << suma % 9973 << "\n";
    }
    fin.close ();
    fout.close ();
    return 0;
}