Cod sursa(job #1709804)

Utilizator UBB_RETIRED_BUT_DANGEROUSUBBTEAM UBB_RETIRED_BUT_DANGEROUS Data 28 mai 2016 13:56:26
Problema Consecutive Scor 0
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 1.39 kb
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

ifstream in("consecutive.in");
ofstream out("consecutive.out");

bool isPowerOfTwo(long long n)
{
	if ((n & (n - 1)) == 0)
		return 1;
	return 0;
}

bool isPrime(int x)
{
	if (x == 2)
	{
		return true;
	}
	if (x % 2 == 0)
	{
		return false;
	}

	int right = sqrt(x);
	for (int i = 3; i <= right; i += 2)
	{
		if (x % i == 0)
		{
			return false;
		}
	}

	return true;
}

bool cmp(pair<long long, long long> x, pair<long long, long long> y)
{
	if ((y.second - y.first) >= (x.second - x.first))
		return true;
	return false;
}

int main()
{
	int T; in >> T;
	for (int t = 0; t < T; t++)
	{
		int N; in >> N;
		vector<pair<int, int>> sol;

		if (isPowerOfTwo(N) || N == 1)
		{
			out << 0 << '\n';
			continue;
		}

		sol.push_back(make_pair(N / 2, N / 2 + 1));
		if (!isPrime(N))
		{
			for (int q = 3; q < N; q += 2)
			{
				if (N % q != 0)
				{
					continue;
				}

				int r = N / q;
				int left = r - q / 2;
				int right = r + q / 2;
				if (left < 1)
				{
					continue;
				}

				sol.push_back(make_pair(left, right));
			}

			sort(sol.begin(), sol.end(), cmp);

		}
		unsigned int size = sol.size();
		out << size << '\n';
		for (int i = 0; i < size; i++)
		{
			out << sol[i].first << ' ' << sol[i].second << '\n';
		}
	}

	return 0;
}