Cod sursa(job #1981175)

Utilizator trifangrobertRobert Trifan trifangrobert Data 15 mai 2017 02:00:42
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <iostream>
#include <fstream>
#include <cmath>
#include <conio.h>

using namespace std;

ifstream f("ssnd.in");
ofstream g("ssnd.out");
int t;
long long n;
bool ciur[1000001];

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++;
			}
		}
}

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

int Card(int n)
{
	int r = n/2,i,k,nrdiv=1,cn;
	for (i = 2;i <= r;i++)
	{
		if (!ciur[i] && n % i == 0)
		{
			cn = n;
			k = 0;
			while (cn % i == 0)
			{
				k++;
				cn /= i;
			}
			nrdiv *= k+1;
		}
	}
	if (nrdiv == 1)
		return 2;
	return nrdiv;
}

int Sum(int n)
{
	int r = n/2, i, k, sum = 1, cn;
	for (i = 2;i <= r;i++)
	{
		if (!ciur[i] && n % i == 0)
		{
			cn = n;
			k = 0;
			while (cn % i == 0)
			{
				k++;
				cn /= i;
			}
			sum = sum *(lgput(i, k+1) - 1) / (i - 1);
		}
	}
	if (sum == 1)
		return n + 1;
	return sum;
}

int main()
{
	Ciur();
	f >> t;
	for (int i = 1;i <= t;i++)
	{
		f >> n;
		g << Card(n) << " ";
		g << Sum(n) % 9973 << "\n";
		//  Impartirea la 9973 nu cred ca trebuie pusa aici
	}
	_getch();
	return 0;
}