Cod sursa(job #1098074)

Utilizator bDannYdBurileanu Daniel bDannYd Data 4 februarie 2014 13:42:49
Problema Suma si numarul divizorilor Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.14 kb
#include<stdio.h>
#include<math.h>

#define MOD 9973

int t;
char visited[10000000];

void sieve() {
	int i, j;

	for (i = 2; i * i <= 1000000; ++i) {
		if (!visited[i]) {
			for (j = i + i; j <= 1000000; j += i) {
				visited[j] = 1;
			}
		}
	}
}


long long readFromFile(FILE *fin) {
	long long number;

	fscanf(fin, "%lld", &number);

	return number;
}

void printToFile(FILE *fout, int number, int sum) {
	fprintf(fout, "%d %d\n", number, sum);
}

void process() {
	FILE *fin, *fout;
	long long n;
	long i;
	int number, sum, power, prod;

	fin = fopen("ssnd.in", "r");
	fout = fopen("ssnd.out", "w");

	t = (int)readFromFile(fin);

	do {
		n = readFromFile(fin);
		number = sum = 1;
		for (int i = 2; i <= sqrt(n); ++i) {
			if (n % i == 0 && !visited[i]) {
				power = 0;
				prod = i;
				while (n % prod == 0) {
					++power;
					prod *= i;
				}

				number *= (1 + power);
				sum *= ((long long)((pow(i, power + 1) - 1) / (i - 1)) % MOD);
			}
		}

		if (number == 1) {
			++number;
			sum += ((n % MOD) % MOD);
		}

		printToFile(fout, number, sum);
		--t;	
	} while (t);

	fclose(fin);
	fclose(fout);
}

int main() {
	sieve();
	process();
	return 0;
}