Cod sursa(job #1350900)

Utilizator alexandru.ghergutAlexandru-Gabriel Ghergut alexandru.ghergut Data 21 februarie 2015 00:08:49
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.85 kb
#include <fstream>
#include <bitset>
#include <iostream>
#include <cmath>
using namespace std;

#define max 1000000
#define ULL unsigned long long
#define MOD 9973

bitset<max + 1> sieve;

void sieveOfEratosthenes(int primes[]);
ULL modPow(ULL base, int exp);

int main()
{
    int t, i;
    long long n;
    int primes[max + 1];
    sieveOfEratosthenes(primes);

    ifstream f("ssnd.in");
    f >> t;
    int card, p, j, s;
    ofstream g("ssnd.out");
    for (i = 1; i <= t; i++)
    {
        f >> n;
        card = s = 1;
        for (j = 0; primes[j] <= sqrt(n); j++)
        {
            if (n % primes[j] == 0)
            {
                p = 0;
                do
                {
                    p++;
                    n /= primes[j];
                } while (n % primes[j] == 0);

                card *= (p + 1);
                s = ((s % MOD) * (((modPow(primes[j], p + 1) - 1) / (primes[j] - 1)) % MOD)) % MOD;
            }
        }
        if (n > 1)
        {
            card *= 2;
            s = ((s % MOD) * (((modPow(n, 2) - 1) / (n - 1))) % MOD) % MOD;
        }
        g << card << " " << s << "\n";
    }
    f.close();
    g.close();

    return 0;
}

void sieveOfEratosthenes(int primes[])
{
    int i, j, k = -1;
    // 0 - prim, 1 - neprim
    primes[++k] = 2;
    for (i = 3; i <= sqrt(max); i += 2)
    {
        if (sieve[i] == 0)
            primes[++k] = i;
        for (j = i * i; j <= max; j += i + i)
            sieve[j] = 1;
    }

    int start;
    if (((int)sqrt(max) + 1) % 2 == 0)
        start = sqrt(max) + 2;
    else
        start = sqrt(max) + 1;
    for (i = start; i <= max; i += 2)
        if (sieve[i] == 0)
            primes[++k] = i;
}

ULL modPow(ULL base, int exp)
{
    ULL result = 1;
    while (exp)
    {
        if (exp & 1)
            result *= base;
        base *= base;
        exp >>= 1;
    }

    return result;
}