Cod sursa(job #1708960)

Utilizator linia_intaiConstantinescu Iordache Ciobanu Noi cei din linia intai linia_intai Data 28 mai 2016 10:23:07
Problema Consecutive Scor 100
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 1.19 kb
#include <cmath>

#include <algorithm>
#include <fstream>
#include <iostream>
using namespace std;

vector< pair<long long, long long> > v;

void solve(long long k, long long n) {
    long long value = n / k - k + 1;
    if (value > 0 && value % 2 == 0) {
        v.push_back(make_pair(value / 2, value / 2 + k - 1));
    }
}

int main() {
    ifstream cin("consecutive.in");
    ofstream cout("consecutive.out");
    int t;
    long long n;
    for (cin >> t; t; -- t) {
        v.clear();
        cin >> n;
        n = 2 * n;
        long long k = sqrt(1.0 * n);
        for (long long i = 1; i <= k; i += 1) {
            if (n % i == 0) {
                if (i != 1) {
                    solve(i, n);
                }
                if (i * i != n) {
                    solve(n / i, n);
                }
            }
        }
        sort(v.begin(), v.end(), [](const pair<long long, long long> &a, const pair<long long, long long> &b) {
            return a.second - a.first < b.second - b.first; 
        });
        cout << v.size() << "\n";
        for (auto p : v) {
            cout << p.first << " " << p.second << "\n";
        }
    }
    return 0;
}