Cod sursa(job #1709879)

Utilizator UPB_itslupusUPB Crecana Cristache Jercaianu UPB_itslupus Data 28 mai 2016 14:16:59
Problema Consecutive Scor 100
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 1.94 kb
#include<iostream>
#include<fstream>
#include<vector>
#include<math.h>
#include<set>

using namespace std;

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

long long T, N;

long long num_sol;
long long sol_found = 0;

int main()
{
    fin >> T;
    for (long long t = 0; t < T; t++) {
        fin >> N;
        num_sol = 0;
        long long s = sqrt(N);
        if (N == 1) {
            fout << 0 << '\n';
            continue;
        }
        set<pair<long long, pair<long long, long long>>> st;
        for (long long i = 2; i <= s; i++) {
            if (N % i == 0) {
                long long div = N / i;
                if (i % 2 != 0) {
                    if ((div - (i - 1)/2) > 0) {
                        st.insert(make_pair(i, make_pair(div - (i - 1) / 2, div + (i - 1) / 2)));
                        num_sol++;
                    } else {
                        int tmp = div - (i - 1) / 2;
                        st.insert(make_pair(div + (i - 1) / 2 + tmp, make_pair(-tmp + 1, div + (i - 1) / 2)));
                        num_sol++;
                    }
                }
                if (div % 2 != 0 && div != i) {
                    if ((i - (div - 1) / 2) > 0) {
                        st.insert(make_pair(div, make_pair(i - (div - 1) / 2, i + (div - 1) / 2)));
                        num_sol++;
                    } else {
                        int tmp = i - (div - 1) / 2;
                        st.insert(make_pair(i + (div - 1) / 2 + tmp, make_pair(-tmp + 1, i + (div - 1) / 2)));
                        num_sol++;
                    }
                }
            }
        }

        if (N % 2 != 0) {
            st.insert(make_pair(2, make_pair((N - 1) / 2, (N - 1) / 2 + 1)));
            num_sol++;
        }

        fout << num_sol << '\n';
        for (auto it = st.begin(); it != st.end(); ++it) {
            auto p = it->second;
            fout << p.first << " " << p.second << '\n';
        }
    }
}