Pagini recente » Cod sursa (job #2160683) | Cod sursa (job #2937575) | Cod sursa (job #893231) | Cod sursa (job #1764255) | Cod sursa (job #1709730)
#include <fstream>
#include <vector>
#include <algorithm>
#include <set>
#include <math.h>
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 cmp(pair<int, int> x, pair<int, int> y)
{
if (x.first > y.first)
{
return true;
}
return false;
}
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;
}
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));
set<int> divisors;
int factor = 2;
int coefpowfactor = 1;
int current = N;
while (current != 1)
{
if (isPrime(current))
{
divisors.insert(current);
break;
}
while (current % factor == 0)
{
coefpowfactor *= factor;
current /= factor;
divisors.insert(coefpowfactor);
}
factor++;
coefpowfactor = 1;
}
for (set<int>::iterator it = divisors.begin(); it != divisors.end(); it++)
{
int q = *it;
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);
int size = sol.size();
out << size << '\n';
for (unsigned int i = 0; i < size; i++)
{
out << sol[i].first << ' ' << sol[i].second << '\n';
}
}
return 0;
}