Cod sursa(job #1386772)

Utilizator CiurezAndreiCiurez Marius-Andrei CiurezAndrei Data 13 martie 2015 11:19:39
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <fstream>
#include <bitset>
#define MOD 9973
#define DIM 1000005

using namespace std;

ifstream fin("ssnd.in");
ofstream fout("ssnd.out");

int T, numberDiv, sumDiv, k;
bitset<DIM>A;
int P[DIM], powerPrime;
long long number;

void ciur(){

    for(int i = 2;i <= DIM;i ++)
        if(A[i] == 0){
            P[++k] = i;
        for(int j = 2 * i;j <= DIM; j += i)
            A[j]=1;
        }
}

inline int pow(int a, int b){

    int r = 1;
    a %= MOD;

    while(b)
    {
        if(b % 2 == 0)
        {
            a = (a * a) % MOD;
            b /= 2;
        }
        else
        {
            r = (r * a) % MOD;
            b --;
        }

    }

    return r;
}

int main()
{
    ciur();

    fin >> T;
    while(T)
    {
        fin >> number;

        sumDiv = 1;
        numberDiv = 1;

    for(int i = 1; i <= k && 1LL * P[i] * P[i] <= number; i ++)
    {
        if(number % P[i])
        {
            continue;
        }
        powerPrime = 0;
        while(number % P[i] == 0)
        {
            number /= P[i];
            powerPrime ++;
        }
        numberDiv *= (powerPrime + 1);

        int power1 = (pow(P[i], powerPrime + 1) - 1) % MOD;
        int power2 = pow(P[i] - 1, MOD - 2) % MOD;

        sumDiv = (((sumDiv * power1) % MOD) * power2) % MOD;
    }
    if(number > 1){
        numberDiv *= (1 + 1);
        sumDiv =  1LL * sumDiv * (number + 1) % MOD;
    }

    fout << numberDiv << " " << sumDiv << '\n';

    T--;
    }

    return 0;
}