Cod sursa(job #1060976)

Utilizator federerUAIC-Padurariu-Cristian federer Data 18 decembrie 2013 23:08:24
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include<fstream>
#include<bitset>
#define Nmax 1000005
#define mod 9973
using namespace std;

ifstream fin("ssnd.in");
ofstream fout("ssnd.out");

long p[Nmax];
long nrdiv = 1, j, i, sdiv, rez;
bitset<Nmax> viz;

void ciur()
{
	long ii;
	for (long i = 2; i < Nmax; ++i)
	{
		if (viz[i] == 0)
		{
			p[++j] = i;
			for (ii = 2 * i; ii < Nmax; ii += i)
				viz[ii] = 1;
		}
	}
}

void putere(long b, long e)
{
	while (e)
	{
		if (e % 2 == 0)
		{
			b = (b*b)%mod;
			e /= 2;
		}
		else
		{
			rez = (rez*b)%mod;
			e--;
		}
	}
}

void euclid(int a, int b, int &x, int &y)
{
	if (b == 0)
	{
		x = 1;
		y = 0;
	}
	else
	{
		int x0, y0;
		euclid(b, a%b, x0, y0);
		x = y0;
		y = (mod+x0 - (a / b)*y0)%mod;
	}
}

int inv()
{
	int x, y;
	euclid(p[i] - 1, mod, x, y);
	return x;
}

void div(long X)
{
	int c=0;
	nrdiv = 1;
	sdiv = i=1;
	while (X>1)
	{
		c = 0;
		while (X%p[i] == 0)
		{
			c++;
			X /= p[i];
		}
		if (c > 0)
		{
			rez = 1;
			putere(p[i], c + 1);
			rez--;
			int d = inv();
			sdiv = (sdiv*rez*d)%mod;
			nrdiv *= (c + 1);
		}
		i++;
	}
}

int main()
{
	int T, N, k;
	ciur();
	fin >> T;
	for (k = 1; k <= T; ++k)
	{
		fin >> N;
		div(N);
		fout << nrdiv << ' '<< sdiv<<'\n';
	}

	return 0;
}