Cod sursa(job #1832184)

Utilizator 1475369147896537415369Andrei Udriste 1475369147896537415369 Data 19 decembrie 2016 16:11:46
Problema Suma si numarul divizorilor Scor 10
Compilator c Status done
Runda Arhiva educationala Marime 1.64 kb
#include <stdio.h>
#include <string.h>
#define MOD 9973

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

int PrimeNumbersSieve5(int N){

int i, j, primeNumbers = 1;
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;
        primeNumbers++;
    }
}
return primeNumbers;
}

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(){

FILE *file1, *file2;
unsigned long long T, M, N, i, SDiv, NDiv, power;

file1 = fopen("ssnd.in", "r");
file2 = fopen("ssnd.out", "w");

PrimeNumbersSieve5(1000000);
fscanf(file1, "%llu", &T);

while(T--){

    NDiv = 1;
    SDiv = 1;

    fscanf(file1, "%llu", &N);
    M = N;

    for(i=0; primes[i]*primes[i] <= M; i++){
        power  = 0;
        if(!(N%primes[i])){
            while(!(N%primes[i])){
                power++;
                N /= primes[i];
            }
        NDiv *= (power + 1);
        SDiv = (SDiv * ((expo(primes[i], power + 1) - 1) / (primes[i] - 1))%MOD) % MOD;
        }
    }
    if(NDiv==1 && SDiv==1 && N!=1){
        NDiv = 2;
        SDiv += N;
    }
    fprintf(file2, "%llu %llu\n", NDiv, SDiv);
}

return 0;
}