Cod sursa(job #1039433)

Utilizator sziliMandici Szilard szili Data 23 noiembrie 2013 00:09:21
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <math.h>

#define MAX_PRIME 1000001
#define MOD 9973

using namespace std;

vector<int> primes;
short primCandidates[MAX_PRIME];

void generatePrimeNumbers(){
    for (int i=2; i<=MAX_PRIME; i++){
        if (primCandidates[i] == 0){
            primes.push_back(i);

            int j = 2*i;
            while (j <= MAX_PRIME){
                primCandidates[j] = 1;
                j += i;
            }
        }
    }
}

void handleNumber(long long n){
    long long sum = 1;
    long long divisorNumber = 1;

    int i = 0;
    while (primes[i] <= (int)sqrt(n)){

        if (n % primes[i] == 0){
            int d = 0;
            long long partialPower = 1;
            long long localPowerTerm;

            while (n % primes[i] == 0){
                n = n/primes[i];
                d++;
                partialPower = partialPower * primes[i];
            }

            //we need ( p^(d+1))
            partialPower = partialPower * primes[i];

            divisorNumber *= (d+1);
            localPowerTerm = (partialPower -1)/(primes[i]-1);
            localPowerTerm = localPowerTerm % MOD;

            sum = (sum*localPowerTerm) % MOD;
        }

        i++;
    }

    if (n != 1){
        divisorNumber *= 2;
        sum = (sum * ((n*n -1) / (n-1))) % MOD;
    }


    sum = sum % MOD;

    printf("%lld %lld\n", divisorNumber, sum);
}


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

    generatePrimeNumbers();

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

    long long n;

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

        handleNumber(n);
    }

    return 0;
}