Cod sursa(job #1098094)

Utilizator bDannYdBurileanu Daniel bDannYd Data 4 februarie 2014 14:13:56
Problema Suma si numarul divizorilor Scor 30
Compilator c Status done
Runda Arhiva educationala Marime 1.46 kb
#include<stdio.h>

#define MOD 9973

int t;
int prime[1000001];
int k;
char visited[10000000];

void sieve() {
	int i, j;
	
	k = 0;
	for (i = 2; i * i <= 1000001; ++i) {
		if (!visited[i]) {
			prime[++k] = i;

			for (j = i + i; j <= 1000001; j += i) {
				visited[j] = 1;
			}
		}
	}
}

int pw(int number, int p) {
	int result = 1;

	number %= MOD;

	for (; p; p >>= 1) {
		if (p & 1) {
			result *= number;
			result %= MOD;
		}

		number *= number;
		number %= MOD;
	}

	return result;
}


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, p1, p2;

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

	t = (int)readFromFile(fin);

	do {
		n = readFromFile(fin);
		number = sum = 1;
		for (int i = 1; i <= k && 1ll * prime[i] * prime[i] <= n; ++i) {
			if (n % prime[i]) continue;
			power = 0;
				
			while (n % prime[i] == 0) {
				++power;
				n /= prime[i];
			}

			number *= (1 + power);
			p1 = (pw(prime[i], power + 1) - 1) % MOD;
			p2 = pw(prime[i] - 1, MOD - 2) % MOD;

			sum = (((sum * p1) % MOD) * p2) % MOD;
			
		}

		if (n > 1) {
			number *= 2;
			sum = (1ll * sum * (n + 1) % MOD);
		}

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

	fclose(fin);
	fclose(fout);
}

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