Cod sursa(job #1709685)

Utilizator TeamFIIGUAIC Parjoala TeamFIIG Data 28 mai 2016 13:24:08
Problema Consecutive Scor 0
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 2.05 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;
void Sume()
{
	long long maxi = pow(2, 31);
	long long suma = 0;
	int i;
	s.push_back(0);
	for (i = 1; suma<=maxi; ++i)
	{
		
		suma = suma + i;
		
		s.push_back(suma);
	}
}
int CautBin(int n)
{
	int st, dr, m;
	st = 1;
	if (n > s.size()) dr = s.size() - 1;
	else  dr = n;
	while (st <= dr)
	{
		m = (st + dr) / 2;
		//printf("%d %d %d\n", st, dr, m);
		if (s[m] == n) return m;
		else if (s[m] < n) st = m + 1;
		else if (s[m] > n) dr = m - 1;
	}
	return m;
}
bool Comp(solutie x, solutie y)
{
	return (x.dr - x.st) < (y.dr - y.st);
}
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 == 4)
		{
			int x = 1;
		}
		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));
			}
		}
		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));
			}
			/*
			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 test,n;
	scanf("%lld", &test);
	for (int t = 1; t <= test; t++)
	{
		scanf("%lld", &n);
		sol.clear();
		printf("%lld\n", alg(n));
		for (long long i = 0; i < sol.size(); i++)
		{
			printf("%lld %lld\n", sol[i].first, sol[i].second);
		}

	}
	
}