【题解】CF1758D Range = √Sum

题面传送门

解决思路

通过手算较小的样例,可以得出一种直接的构造方法:

  • n 为奇数,则数列为 n12+2,n12+3,,n,n+3,n+4,,n+n12+3

  • n 为偶数,则数列为 n2,n2+1,,n1,n+1,n+2,,n+n2


证明

为了方便计算,先把原式左右两边都平方。

  • n 为奇数的情况:

左式:

((n+n12+3)(n12+2))2=(n+1)2

右式:

i=n12+2n+i=n+3n+n12+3=(3n+32)(n32+1)2+(5n+112)(n12+1)2=3n238+5n2+16n+118=n2+2n+1=(n+1)2

  • n 为偶数的情况:

左式:

(n+n2n2)2=n2

右式:

i=n2n1+i=n+1n+n2=(3n22)×n22+(5n+22)×n22=3n22n8+5n2+2n8=n2


所以两种情况下均满足题目要求,故构造方法合法。

AC Code

//If, one day, I finally manage to make my dreams a reality...
//I wonder, will you still be there by my side?
#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false)
#define TIE cin.tie(0),cout.tie(0)
#define int long long
#define y1 cyy
#define fi first
#define se second
#define cnt1(x) __builtin_popcount(x)
#define mk make_pair
#define pb push_back
#define pii pair<int,int>
#define ls(x) (x<<1)
#define rs(x) (x<<1|1)
#define lbt(x) (x&(-x))
using namespace std;
int T,n;
void solve(){
	cin>>n;
	if(n&1){
		for(int i=n/2+2;i<=n;i++) cout<<i<<' ';
		for(int i=n+3;i<=n+n/2+3;i++) cout<<i<<' ';
		cout<<endl;
	}
	else{
		for(int i=n/2;i<n;i++) cout<<i<<' ';
		for(int i=n+1;i<=n+n/2;i++) cout<<i<<' ';
		cout<<endl;
	}
}
signed main(){
	IOS;TIE;
	cin>>T;
	while(T--) solve();
	return 0;
}
posted @   Binary_Lee  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
Title
点击右上角即可分享
微信分享提示