Cod sursa(job #1466469)

Utilizator SolcanMihaiSolcan Mihai Andrei SolcanMihai Data 29 iulie 2015 11:46:46
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.42 kb
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <vector>
#include <algorithm>

using namespace std;

vector<long long> ciur;

const long long limit = 1000002;
const long long primes = 78505;
const int MOD = 9973;

void getCiur(vector<long long> &ciur)
{
    char ok[1000002];

    for(long long i = 0; i < limit; i++)
    {
        ok[i] = 1;
    }

    for(long long i = 2; i < limit; i++)
    {
        if(ok[i] == 1)
        {
            for(long long j = i + i; j < limit - 1; j += i)
            {
                ok[j] = 0;
            }
        }
    }

    for(long long i = 2; i < limit; i++)
    {
        if(ok[i] == 1)
        {
            ciur.push_back(i);
        }
    }
}

long long putere(long long x, long long p)
{
    if(p == 0)
    {
        return 1;
    }
    else
    {
        if(p % 2 == 0)
        {
            return putere((x * x), p / 2);
        }

        return (putere(x, p - 1) * x);

    }
}


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

    int t;
    scanf("%i", &t);

    getCiur(ciur);

    for(int k = 0; k < t; k++)
    {
        long long n;
        scanf("%lld", &n);
        long long special = n;

        vector<long long> puteri;
        puteri.clear();

        for(int i = 0; i < primes; i++)
        {
            puteri.push_back(0);
        }

        int nr = 0;

        bool ok = 1;

        while(n > 1)
        {
            while(n % ciur[nr] == 0)
            {
                n /= ciur[nr];
                puteri[nr]++;
                ok = 0;
            }
            nr++;

            if(nr == primes - 1)
            {
                break;
            }
        }

        int nrDivizori = 1;
        int sumaDivizori = 1;

        for(int i = 0; i < primes; i++)
        {
            if(puteri[i] != 0)
            {
                int tmp1;
                tmp1 = 1 + puteri[i];
                nrDivizori *= tmp1;

                int tmp2;
                tmp2 = (putere(ciur[i], puteri[i] + 1) - 1) / (ciur[i] - 1);
                sumaDivizori *= tmp2;

                sumaDivizori %= MOD;
            }
        }

        if(ok == 1)
        {
            nrDivizori += 1;
            sumaDivizori = special + 1;
        }

        printf("%i %i\n", nrDivizori, sumaDivizori);
    }


    return 0;
}