Cod sursa(job #2275239)

Utilizator Catalin_BorzaBorza Catalin-Mihai Catalin_Borza Data 2 noiembrie 2018 22:18:33
Problema Suma si numarul divizorilor Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <iostream>
#include <fstream>
#define MOD 9973
#define MAX 1000001
using namespace std;
long long sd = 1, nd = 1;
int kp, prime[78500];
bool v[MAX];

pair<int, int> eucl_ext(int a, int b)
{
	if (b == 0)
		return { 1, 0 };
	auto p = eucl_ext(b, a % b);
	return { p.second,  p.first - a / b * p.second };
}

int inv_mod(int x, int y)
{
	int inv = eucl_ext(x, y).first;
	if (inv < 0) inv += y;
	return inv;
}

int pw(int x, int y)
{
	int p = 1, m = x;
	while (y)
	{
		if (y & 1)
		{
			p = (p * m) % MOD;
			y--;
		}
		else
		{
			m = (m * m) % MOD;
			y = y >> 1;
		}
	}
	return p;
}

void ciur_gen()
{
	for (int i = 2; i <= MAX; i++)
	{
		if (!v[i])
		{
			prime[kp++] = i;
			for (int j = i << 1; j <= MAX; j += i)
				v[j] = 1;
		}
	}
}

void sdm(long long &x, long long d)
{
	int p = 1;
	while (x % d == 0)
	{
		x /= d;
		p++;
	}
	sd = (sd * p) % MOD;
	nd = (nd * (pw(d, p) - 1) * inv_mod(d - 1, MOD)) % MOD;
}

void dvs(long long x)
{
	for (int i = 0; i < kp && prime[i] * prime[i] <= x; i++)
		sdm(x, prime[i]);
	if (x > 1) sdm(x, x);
}

int main()
{
	ifstream f("ssnd.in");
	ofstream g("ssnd.out");
	ciur_gen();
	int n, x;
	f >> n;
	for (; n; n--)
	{
		f >> x;
		dvs(x);
		g << sd << " " << nd << "\n";
		sd = nd = 1;
	}
	return 0;
}