Cod sursa(job #2201270)

Utilizator emiemiEmi Necula emiemi Data 4 mai 2018 00:46:45
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <fstream>
#include <vector>
#include <cmath>

using namespace std;
ifstream f("ssnd.in");
ofstream g("ssnd.out");

#define MOD 9973

int len = 0;
int v[500000];
bool a[1000000];

void ciur() {
	int i, j;

	v[len++] = 2;
	int l = 1000;
	for(i = 3; i <= l; i += 2)
		if (!a[i]) {
			v[len++] = i;
			for (j = i * i; j < 1000000; j += i)
				a[j] = true;
		}
	for (i = l + 1; i < 1000000; i += 2)
		if (!a[i])
			v[len++] = i;
}

int putere(long long x, int n) {
	long long t = x;
	int res = 1;
	while (n) {
		if (n & 1) {
			res *= t;
			res %= MOD;
		}
		t *= t;
		t %= MOD;
		n /= 2;
	}
	return res;
}

int main() {
	long long nrd, sd, p, t, i, ii, put;
	long long n;
	f >> t;

	ciur();
	for (ii = 1; ii <= t; ++ii) {
		f >> n;
		if (n == 1) {
			nrd = 1;
			sd = 1;
		} else {
			nrd = 1;
			sd = 1;
			for (i = 0; v[i] * v[i] <= n; ++i) {
				if (n % v[i] == 0) {
					n /= v[i];
					p = 1;
					put = v[i] * v[i];
					while (n % v[i] == 0) {
						n /= v[i];
						++p;
						put *= v[i];
					}
					nrd *= (p + 1);
					sd *= (putere(v[i], p + 1) - 1);
					sd %= MOD;
					sd *= (putere(v[i] - 1, MOD - 2));
					sd %= MOD;
					//sd *= (((put - 1) / (v[i] - 1)) % MOD);
					//sd %= MOD;
				}
			}

			if (n > 1) {
				nrd *= 2;
				sd *= ((n + 1) % MOD);
			}
			sd %= MOD;
		}
		g << nrd << ' ' << sd << '\n';
	}

	return 0;
}