CF1788C 题解

一道简单的数学思维题。

题目的翻译有点问题,事实上输入的第一个数应该是 \(t\) (代表数据组数),后面才是每一组数 \(m\) (大家应该能看出来。

Solution

我们假设等差数列的第一项为 \(x\),则根据小学三年级的等差数列求和公式可得这个等差数列的的和为 \(\frac{(x + x + m - 1) \times m}{2}\),亦等于这 \(2m\) 个数的和 \((1 + 2m) \times m\),所以我们可以得到方程: \(\frac{(x + x + m - 1) \times m}{2}=(1 + 2m) \times m\),解得 \(x=\frac{3+3m}{2}\)。由此我们显然能看出如果 \(x\)\(\frac{3+3m}{2}\) 不为整数,则此时无解应输出 No。

接下来就容易了,我们构造每个等差数列的每一项即可,具体看代码。

然后喜提 AC。

AC code

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x7fffffff
ll t,m,vis[1000010];
inline void work(ll k) {
	memset(vis,0,sizeof(vis)); 
	ll f=(3*m+3)/2;
	ll a=1,b=f-a,flag=0,ff=0;
	cout<<a<<" "<<b<<endl;
	vis[a]=1,vis[b]=1;
	for (ll i=2;i<=k;++i) {
		a+=2,--b;
		if (!vis[a]&&!vis[b]&&!flag) {
			cout<<a<<" "<<b<<endl;
			vis[a]=1,vis[b]=1;
			continue;
		}
		flag=1;
	    if (!ff) a=2,b=f+i-1-a,ff=1;
	    if (!vis[a]&&!vis[b]) {
	    	vis[a]=1,vis[b]=1;
	    	cout<<a<<" "<<b<<endl;
		}
	}
}
int main() {
	cin>>t;
	while (t--) {
		cin>>m;
		if (m%2) {
			cout<<"Yes"<<endl;
			work(m);
		}
		else cout<<"No"<<endl;
	}
	return 0;
} 
posted @ 2023-06-06 17:16  Pwtking  阅读(54)  评论(0)    收藏  举报