CF1594A 题解

wonderfish / 2023-08-02 / 原文

题意

\(t\)组数据(\(1 \le t \le 1000\)),每组数据给一个整数 \(n\)\(1 \le n \le 10^{18}\)),找出两个整数 \(l\)\(r\)($ -10^{18}\le l < r \le 10^{18} $) 使 $l + (l + 1)+ \ldots + (r - 1) + r =n $ 。

思路

看到这个题目,首先会想到 \(l = n\)\(r = n\),但是发现题目要求 \(l < r\)

仔细观察一下此题的数据范围,发现 \(l\)\(r\) 可以为负数,但是 \(n\) 为正数。众所周知,互为相反数的两个数和为 \(0\),所以我们可以让 $l = -(n-1) $,即 $l = 1-n $。

于是可以得到 $l + (l + 1)+ \ldots + (r - 1) =0 $,而 $r = n $,所以 $l + (l + 1)+ \ldots + (r - 1) + r =n $ 。

CODE

提示:别忘了开 \(long\) \(long\)

#include<bits/stdc++.h>
#define int long long
using namespace std;
int T,n,l,r;
signed main(){
	scanf("%lld",&T);
	while(T--){
		scanf("%lld",&n); l=1-n; r=n;
		printf("%lld %lld\n",l,r);
	}
	return 0;
}