Cod sursa(job #2158484)

Utilizator nicolaefilatNicolae Filat nicolaefilat Data 10 martie 2018 13:24:22
Problema Consecutive Scor 0
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.47 kb
#include <iostream>
#include <fstream>
#include <cmath>
#include <vector>
#include <algorithm>

using namespace std;

ifstream in("consecutive.in");
ofstream out("consecutive.out");

long long t;
vector<pair<int,int> >v;
long long a,b;

long long ok(long long x){
    long long pas = 1<<30, r = 0;
    while(pas){
        if((r+pas)*(r+pas+1) <= x)
            r += pas;
        pas /= 2;
    }
    if(r*(r+1) == x)
        return r;
    return 0;
}

void brut(long long n){
    v.clear();
    int x = 2;
    for(a = 1; a <= n/2; a ++){
        b = 2*n + a*(a-1);
        if(ok(b)){
            b = ok(b);
            v.push_back(make_pair(a,b));
            a = a + x;
            x++;
        }
    }
    reverse(v.begin(),v.end());
    out<<v.size()<<"\n";
    for(int i = 0; i < v.size(); i++)
        out<<v[i].first<<" "<<v[i].second<<"\n";
}

bool e_bine(long long x,long long n){
    if((2*n) % (x+1) == 0 && (2*n/(x+1) - x) % 2 == 0) {
        a = (2*n/(x+1)- x)/2;
        b = x + a;
        return true;
    }
    return false;
}
void rez(long long n){
    v.clear();
    int x;
    for(x = 1; x*x <= n+1; x ++)
        if(e_bine(x,n))
            v.push_back(make_pair(a,b));
    out<<v.size()<<"\n";
    for(int i = 0; i < v.size(); i++)
        out<<v[i].first<<" "<<v[i].second<<"\n";
}

int main()
{
    in>>t;
    long long nr;
    for(int i = 0; i < t; i++){
        in>>nr;
        rez(nr);
    }


    return 0;
}