Cod sursa(job #1466496)

Utilizator SolcanMihaiSolcan Mihai Andrei SolcanMihai Data 29 iulie 2015 12:23:30
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.89 kb
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <vector>
#include <algorithm>
#define limit 1000002
#define primes 78505
#define MOD 9973

using namespace std;

vector<long long> ciur;
char ok[1000002];

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

            ciur.push_back(i);
        }
    }
}

long long putere(long long x, long long p)
{
    long long prod = 1;

    while(p > 1)
    {
        if(p % 2 == 0)
        {
            p /= 2;
            x *= x;
        }
        else
        {
            p--;
            prod *= x;
        }
    }

    return (prod * x);
}



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

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

    getCiur();

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

        int nr = 0;
        bool ok = 1;

        int nrDivizori = 1;
        int sumaDivizori = 1;

        for(int i = 0; i < ciur.size(); i++)
        {
            if(n == 1)
            {
                break;
            }

            int put = 0;
            while(n % ciur[i] == 0)
            {
                n /= ciur[i];
                put++;
                ok = 0;
            }

            if(put != 0)
            {
                nrDivizori *= (put + 1);
                sumaDivizori *= (putere(ciur[i], put + 1) - 1) / (ciur[i] - 1);

                sumaDivizori %= MOD;
            }
        }

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


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


    return 0;
}