Cod sursa(job #1878113)

Utilizator 1475369147896537415369Andrei Udriste 1475369147896537415369 Data 13 februarie 2017 21:26:57
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <cstdio>
#include <string.h>
#include <cmath>
using namespace std;
#define MOD 9973

int primes[78498] = {2};
int k = 0;

void PrimeNumbersSieve5(int N){

int i, j;
char list[2000005]; memset(list, 0, 2000005);

for(i = 1; ((i * i) << 1) + (i << 1) <= N; i += 1){
    if((list[i >> 3] & (1 << (i & 7))) == 0){
        for(j = ((i * i) << 1) + (i << 1); (j << 1) + 1 <= N; j += (i << 1) + 1){
             list[j >> 3] |= (1 << (j & 7));
        }
    }
}
for (i = 1; 2 * i + 1 <= N; ++i){
    if((list[i >> 3] & (1 << (i & 7))) == 0){
        primes[++k] = 2 * i + 1;
    }
}
}

unsigned long long expo(unsigned long long a, unsigned long long b){

unsigned long long result = 1;

while (b){

    if (b&1){
        result = (result * a);
    }

    b >>= 1;
    a = (a * a);
}
return result;
}

int main(){

unsigned long long T, M, N, i, Sum, nDiv, power;

freopen("ssnd.in", "r", stdin);
//freopen("ssnd.out", "w", stdout);

PrimeNumbersSieve5(1000000);
scanf("%llu", &T);

while(T--){

    nDiv = 1;
    Sum = 1;

    scanf("%llu", &N);
    M = N;
    int sqrtN = (int)ceil(sqrt(N));
    for(i=0; primes[i]<=sqrtN; i++){
        power = 0;
        if(!(M%primes[i])){
            while(M%primes[i]==0){
                M /= primes[i];
                power++;
            }
            nDiv *= (power + 1);
             Sum = (Sum * ((expo(primes[i], power+1) - 1) / (primes[i] - 1))%MOD) % MOD;

        }
        if(M==1){
            break;
        }
    }
    if(nDiv==1 && Sum==1 && N!=1){
        nDiv = 2;
        Sum += N;
    }
    printf("%llu %llu\n", nDiv, Sum);
}

return 0;
}