Cod sursa(job #1981928)

Utilizator trifangrobertRobert Trifan trifangrobert Data 17 mai 2017 10:46:09
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <fstream>
#include <cmath>

using namespace std;

ifstream f("ssnd.in");
ofstream g("ssnd.out");
int t;
long long n, s, card;

bool ciur[1000001];
int v[500001];

void Ciur()
{
	ciur[0] = ciur[1] = true;
	int k;
	for(int i=2;i<=1000001;i++)
		if (ciur[i] == false)
		{
			k = 2;
			while (k*i <= 1000001)
			{
				ciur[k*i] = true;
				k++;
			}
		}
}

void Vec()
{
	int k = 0;
	for (int i = 2;i <= 1000001;i++)
		if (!ciur[i])
			v[++k] = i;
	v[0] = k;
}

long long lgput(long long base, long long exp)
{
	long long rez = 1;
	while (exp)
	{
		if (exp % 2)
		{
			rez *= base;
			exp--;
		}
		base *= base;
		exp /= 2;
	}
	return rez;
}

void ssnd(long long n)
{
	card = s = 1;
	long long d = 0, p;
	while (n % 2 == 0)
	{
		n /= 2;
		d++;
	}
	if (d)
	{
		card = d + 1;
		s = lgput(2, d + 1) - 1;
	}
	long long r = sqrt(n);
	for (int i = 2 ; v[i] <= r ; i++)
	{
		d = 0;
		while (n % v[i] == 0)
		{
			n /= v[i];
			d++;
		}
		if (d)
		{
			card *= d + 1;
			s *= (lgput(v[i], d + 1) - 1) / (v[i] - 1);
			r = sqrt(n);
		}
	}
	if (n != 1)
	{
		card *= 2;
		s *= (lgput(n, 2) - 1) / (n - 1);
	}
	g << card << " " << s % 9973 << "\n";
}

int main()
{
	Ciur();
	Vec();
	f >> t;
	for (int i = 1;i <= t;i++)
	{
		f >> n;
		ssnd(n);
	}
	return 0;
}