天天看点

第一道acm题(学校作业)

Theofanis has a riddle for you and if you manage to solve it, he will give you a Cypriot snack halloumi for free (Cypriot cheese).

You are given an integer nn. You need to find two integers ll and rr such that -10^{18} \le l < r \le 10^{18}−1018≤l<r≤1018 and l + (l + 1) + \ldots + (r - 1) + r = nl+(l+1)+…+(r−1)+r=n.

Input

The first line contains a single integer tt (1 \le t \le 10^41≤t≤104) — the number of test cases.

The first and only line of each test case contains a single integer nn (1 \le n \le 10^{18}1≤n≤1018).

Output

For each test case, print the two integers ll and rr such that -10^{18} \le l < r \le 10^{18}−1018≤l<r≤1018 and l + (l + 1) + \ldots + (r - 1) + r = nl+(l+1)+…+(r−1)+r=n.

It can be proven that an answer always exists. If there are multiple answers, print any.

#include<iostream>
using namespace std;
int main() {
    long long  l[10000] = { 0 }, r[10000] = { 0 };//n为给定的数,l,r为机找的数,且l<r
    unsigned long long n;
    int t = 0;
    cin >> t;
    for (int i = 0;i < t;i++) {
        cin >> n;
        l[i] = 0 - n + 1;
        r[i] = n;
    }
    for (int i = 0;i < t;i++) {
        cout << l[i] << " " << r[i]<<endl;
    }
    return 0;
}
      
next one is alternative scheme.      
#include<iostream>
using namespace std;
int main() {
    long long n = 0, times, p[10000] = { 0 }, q[10000] = { 0 };
    cin >> times;
    for (int i = 0;i < times;i++) {
        cin >> n;
        if (n % 2 == 1) {
            /*cout << (n / 2) << " " << (n / 2 + 1);*/
            p[i] = n / 2;
            q[i] = n / 2 + 1;
        }
        if (n % 2 == 0) {
            int k = n;
            while (k != 1) {
                k /= 2;
                if (k % 2 == 1 && k != 1) {
                    /*cout << n / k - (k / 2) << " " << n / k + (k / 2);*/
                    p[i] = n / k - (k / 2);
                    q[i] = n / k + (k / 2);

                    break;
                }
                else if (k == 1) {
                    /*cout << (0 - n + 1) << " " << n;*/
                    p[i] = 0 - n + 1;
                    q[i] = n;
                }
            }
        }
    }
    for (int i = 0;i < times;i++) {
        cout << p[i] << " " << q[i]<<endl;

    }
    return 0;
}