Cod sursa(job #1378522)

Utilizator BonCipBonciocat Ciprian Mircea BonCip Data 6 martie 2015 12:44:49
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <stdio.h>
#define PMAX 1000000
#define PN_MAX 100000

char ciur[PMAX + 1];
long long compact[PN_MAX], sp;

void Erathostenes()
{
	for (int i = 2; i <= PMAX; ++i) {
		if (!ciur[i]) {
			for (int j = 2 * i; j <+ PMAX; j += i) {
				ciur[j] = 1;
			}
		}
	}
}

void MakeCompact()
{
	for (int i = 2; i <= PMAX; ++i) {
		if (!ciur[i]) {
			compact[++sp] = i;
		}
	}
}

int pwr(int a, int b, int m)
{
	if (b) {
		int par = pwr(a, b / 2, m);
		par = (par * par) % m;
		return b % 2 ? (par * a) % m : par;
	} else {
		return 1;
	}
}

int main()
{
	FILE *fin, *fout;
	fin = fopen("ssnd.in", "r");
	fout = fopen("ssnd.out", "w");

	Erathostenes();
	MakeCompact();

	int t;
	fscanf(fin, "%d", &t);

	int i;
	for (i = 0; i < t; ++i) {
		long long n;
		fscanf(fin, "%lld", &n);
		long long p = 1, numdiv = 1, sumdiv = 1;
		while (p <= sp && compact[p] * compact[p] <= n) {
			int alpha = 0;
			while (n % compact[p] == 0) {
				n /= compact[p];
				++alpha;
			}
			if (alpha) {
				numdiv = numdiv * (alpha + 1);
				if (numdiv > 9973) {
					numdiv %= 9973;
				}
				sumdiv = (sumdiv * (pwr(compact[p], alpha + 1, 9973) + 9972) * pwr(compact[p] - 1, 9971, 9973)) % 9973;
			}
			++p;
		}
		if (n > 1) {
			numdiv = numdiv * 2;
			if (numdiv > 9973) {
				numdiv %= 9973;
			}
			sumdiv = sumdiv * (n + 1);
			if (sumdiv > 9973) {
				sumdiv %= 9973;
			}
		}
		fprintf(fout, "%lld %lld\n", numdiv, sumdiv);
	}

	fclose(fin);
	fclose(fout);
	return 0;
}