Cod sursa(job #1710087)

Utilizator TeamFIIGUAIC Parjoala TeamFIIG Data 28 mai 2016 14:59:09
Problema Consecutive Scor 0
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 3.29 kb
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
#include<cstdio>
#include <cmath>
#include<algorithm>

using namespace std;
struct solutie
{
	int st, dr;
};
vector <long long> s;
vector < pair <long long, long long> > sol;
int nrsol;

long long alg(long long n)
{
	long long d = 2;
	long long nrsol = 0;
	int last_stg = 2;
	while (last_stg > 1)
	{
		long long mij = n / d;
		long long st, dr;
		if (d % 2 == 1)
		{
			st = mij - (d / 2 );
			dr = mij + (d / 2);
			if (dr*(dr + 1) / 2 - (st - 1)*st / 2 == n || (st == 1 && (dr*(dr+1)/2 == n)))
			{
				nrsol++;
				sol.push_back(make_pair(st, dr));
				//cout << "d:" << d << "\n";
			}
			else
			{
				int suma = dr*(dr + 1) / 2 - (st - 1)*st / 2 == n || (st == 1 && (dr*(dr + 1) / 2 == n));
				int x = st;
				int y = dr;
				while (mij > n / (d + 1))
				{
					mij = (st + dr) / 2;
					if (suma==n)
					{
						nrsol++;
						sol.push_back(make_pair(st, dr));
						//cout << "d:" << d << "\n";
					}
					if (suma >= n)
					{
						suma -= x;
						x++;
					}
					if (suma < n)
					{
						y++;
						suma += y;
					}
				}
			}
		}
		else
		{
			dr = mij + (d / 2);
			st = mij - (d / 2 - 1);
			if (dr*(dr + 1) / 2 - (st - 1)*st / 2 == n || (st == 1 && (dr*(dr + 1) / 2 == n)))
			{
				nrsol++;
				sol.push_back(make_pair(st, dr));
				//cout << "d:" << d << "\n";

			}
			else
			{
				int suma = dr*(dr + 1) / 2 - (st - 1)*st / 2 == n || (st == 1 && (dr*(dr + 1) / 2 == n));
				int x = st;
				int y = dr;
				while (mij > n / (d + 1))
				{
					mij = (st + dr) / 2;
					if (suma == n)
					{
						nrsol++;
						sol.push_back(make_pair(st, dr));
						//cout << "d:" << d << "\n";
					}
					if (suma >= n)
					{
						suma -= x;
						x++;
					}
					if (suma < n)
					{
						y++;
						suma += y;
					}
				}
			}
			/*
			dr = mij + (d / 2 - 1);
			st = mij - (d / 2 );
			if (dr*(dr + 1) / 2 - (st - 1)*st / 2 == n)
			{
				nrsol++;
				sol.push_back(make_pair(st, dr));
			}
			*/
		}
		last_stg = st;
		d++;		
	}
	return nrsol;
}
int main()
{
	freopen("consecutive.in", "r", stdin);
	freopen("consecutive.out", "w", stdout);
	long long n;
	int test;
	scanf("%d", &test);
	for (int t = 1; t <= test; t++)
	{
		scanf("%lld", &n);
		long long sq = sqrt(n);
		long long nrsol = 0;
		sol.clear();
		for (long long k = 2; sq * 2>= k ; k++)
		{
			if (2 * n % k == 0)
			{
				long long a = (2 * n / k - k + 1) / 2;
				long long b = a + k - 1;
				if (b*(b + 1) / 2 - a * (a - 1) / 2 == n && a> 0)
				{
					if (find(sol.begin(), sol.end(), make_pair(a, b)) == sol.end())
					{
						nrsol++;
						sol.push_back(make_pair(a, b));
					}
					
				}
			}
			long long save = k;
			if (n%k == 0)
			{
				k = n / k;
				if (2 * n % k == 0)
				{
					long long a = (2 * n / k - k + 1) / 2;
					long long b = a + k - 1;
					if (b*(b + 1) / 2 - a * (a - 1) / 2 == n && a > 0)
					{
						if (find(sol.begin(), sol.end(), make_pair(a, b)) == sol.end())
						{
							nrsol++;
							sol.push_back(make_pair(a, b));
						}
					}
				}
			}
			
			k = save;
		}
		printf("%lld\n", nrsol);
		for (int i = 0; i < nrsol; i++)
		{
			printf("%lld %lld\n", sol[i].first, sol[i].second);
		}
	}
	
}