题解 CF1594A

Description

给你一个整数 \(n\),你需要找出两个整数 \(l,r\) 使得 \(l+(l+1)+\dots(r-1)+r=n\)

Solution

第一眼等差数列,但是 \(-10^{18}\le n \le 10^{18}\) 完全无法枚举完 \(l\),\(r\),所以我们另辟蹊径。

假设 \(n=6\)

\(l=1,r=6\) 时,可以写成

\(1+2+3+4+5+6\)

但是我们只想要加和为 \(6\),怎么办?

\(1+(-1)+2+(-2)+3+(-3)+4+(-4)+5+(-5)+6\)

整理一下

\((-5)+(-4)+(-3)+(-2)+(-1)+0+1+2+3+4+5+6\)

这不就是我们要求的吗?

显然,\(l=-n+1,r=n\)

Code

代码过于简单,没有注释。

/*
* @Author: smyslenny
* @Date:    2021.10.10
* @Title:   CF1594A
* @Main idea:构造
*/
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <iomanip>
#include <cstring>
#include <cstdlib>
#include <queue>
#include <vector>

#define int long long 

using namespace std;
int T,n;
int read()
{
	int x=0,y=1;
	char c=getchar();
	while(c<'0' || c>'9') {if(c=='-') y=0;c=getchar();}
	while(c>='0' && c<='9') { x=x*10+(c^48);c=getchar();}
	return y?x:-x;
}

signed main()
{
	T=read();
	while(T--)
	{
		n=read();
		printf("%lld %lld\n",n-1,n); 
	}
	return 0;
}
全部评论

相关推荐

白火同学:1、简历可以浓缩成一页,简历简历先要“简”方便HR快速过滤出有效信息,再要“历”用有效信息突出个人的含金量。 2、教育背景少了入学时间~毕业时间,HR判断不出你是否为应届生。 3、如果你的平台账号效果还不错,可以把账号超链接或者用户名贴到对应位置,一是方便HR知道你是具体做了什么内容的运营,看到账号一目了然,二是口说无凭,账号为证,这更有说服力。
面试被问期望薪资时该如何...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务