Cod sursa(job #1713227)

Utilizator akaprosAna Kapros akapros Data 4 iunie 2016 22:48:50
Problema Consecutive Scor 0
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.66 kb
#include <bits/stdc++.h>
#define ll long long
#define Nmax 200004
using namespace std;
int t;
ll n, p, k, sol;
struct Sol
{
    ll x;
    ll y;
} v[Nmax];
int cmp(const Sol a, const Sol b)
{
    return a.y < b.y;
}
void read()
{
    scanf("%lld", &n);
}
void solve()
{
    int i;
    for (i = 2; i * i * 1LL <= n * 2; ++i)
        if ((n * 2) % i == 0)
        {
            if (i * i == n * 2 && (n - ((i * (i - 1) ) / 2)) % i == 0)
            {
                v[++ sol].y = i;
                v[sol].x = (n - ((i * (i - 1) ) / 2)) / i;
                break;
            }
            if ((n - ((i * (i - 1) ) / 2)) % i == 0)
            {
                v[++ sol].y = i;
                v[sol].x = (n - ((i * (i - 1) ) / 2)) / i;
            }

            if ((n - ((((n * 2) / i) * (((n * 2) / i) - 1) ) / 2)) % ((n * 2) / i) == 0 &&
                (n - ((((n * 2) / i) * (((n * 2) / i) - 1) ) / 2)) > 0)
            {
                v[++ sol].y = (n * 2) / i;
                v[sol].x = (n - ((((n * 2) / i) * (((n * 2) / i) - 1) ) / 2)) / ((n * 2) / i);
            }

        }
    i = n * 2;

    if ((n - ((i * (i - 1) ) / 2)) > 0)
    {
        v[++ sol].y = i;
        v[sol].x = (n - ((i * (i - 1) ) / 2)) / i;
    }
}
void write()
{
    int i;
    printf("%d\n", sol);
    sort(v + 1, v + sol + 1, cmp);
    for (i = 1; i <= sol ; ++i)
        printf("%lld %lld\n", v[i].x, v[i].x + v[i].y - 1);
    sol = 0;
}
int main()
{
    freopen("consecutive.in", "r", stdin);
    freopen("consecutive.out", "w", stdout);
    scanf("%d", &t);
    while (t --){
    read();
    solve();
    write();}
    return 0;
}