Cod sursa(job #2517468)

Utilizator rapunzelMihnea Andreescu rapunzel Data 3 ianuarie 2020 16:57:29
Problema Consecutive Scor 0
Compilator cpp-64 Status done
Runda Arhiva ICPC Marime 1.1 kb
/// orz tourist
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>

using namespace std;

int get_x(int n, int l) {
  long long val = 2LL * n / l - l + 1;
  if (val & 1) {
    return -1;
  }
  val /= 2;
  if (val >= 1) {
    return val;
  } else {
    return -1;
  }
}

void print(int n, vector<int> sol) {
  for (auto &len : sol) {
    int l = get_x(n, len), r = l + len - 1;
    printf("%d %d\n", l, r);
  }
}

int main() {
  freopen ("consecutive.in", "r", stdin);
  freopen ("consecutive.out", "w", stdout);

  int t;
  scanf("%d", &t);
  while (t--) {
    vector<int> sol, rev;
    int n;
    scanf("%d", &n);
    long long val = 2 * n;
    for (long long i = 1; i * i <= val; i++) {
      if (val % i == 0) {
        if (i > 1 && get_x(n, i) != -1) {
          sol.push_back(i);
        }
        if (i * i != val && get_x(n, val / i) != -1) {
          rev.push_back(val / i);
        }
      }
    }
    printf("%d\n", (int) sol.size() + (int) rev.size());
    reverse(rev.begin(), rev.end());
    print(n, sol);
    print(n, rev);
  }

}