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;
}

浙公网安备 33010602011771号