1 条题解
-
0
自动搬运
来自洛谷,原作者为

VinstaG173
Si Dieu n'existait pas, il faudrait l'inventer.搬运于
2025-08-24 22:30:32,当前版本为作者最后更新于2021-04-12 21:06:43,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
小学数学经典题。小学曾在多个 MO 课听过做法。可是赛时由于设备原因写代码太麻烦了不想写,否则应该可以首 A(
首先,我们发现 与 奇偶性相同,即 $\sum\limits_{i=1}^{n}(a_i-b_i) \equiv \sum\limits_{i=1}^{n}(a_i+b_i) \pmod{2}$。
上式左边是 ,右边是 。推一推发现需要 。
然后感觉这个问题不是很好处理,联想到有解条件是 ,并且差取遍 ,想到小学时很喜欢的一个问题:
把 至 各两个排成一列,使两个 之间隔 个数。
当时脑抽以为这个问题有解条件也是 ,推了下小情况发现是 (
但是发现如果把 变成 再加两个相邻的 ,正好变成两个 的下标差 ,并且有解条件是 。于是我就做出来了?
回忆了一下以前讲的构造,记得我特别喜欢它的原因是除了几个数外都是两个 套着两个 的形式。搞了一下搞出来了。
然后发现我的构造和 std 一模一样。。。大概就是这题引申过来的吧(
Code:
#include<cstdio> #define rg register int n; int ans[2][1000003]; int main() { scanf(" %d",&n); if(n&2)return 0&puts("-1 0"); int m=n>>2; if(n&1) { ans[0][1]=1,ans[1][1]=2; ans[0][n]=n,ans[1][n]=n<<1; ans[0][n-2]=m+2,ans[1][n-2]=n+m; ans[0][n>>1]=n+(n>>1),ans[1][n>>1]=m<<3|1; ans[0][n-1]=(m+1)<<1,ans[1][n-1]=n+(m<<1|1); for(rg int i=1;i<m;++i) { ans[0][n-((i+1)<<1)]=2+i,ans[1][n-((i+1)<<1)]=n-i; ans[0][i<<1]=((m+1)<<1)-i,ans[1][i<<1]=((m+1)<<1)+i; ans[0][n-(i<<1|1)]=n+i,ans[1][n-(i<<1|1)]=(m<<3|1)-i; ans[0][i<<1|1]=n+(m<<1)-i,ans[1][i<<1|1]=n+(m<<1|1)+i; } } else { ans[0][1]=1,ans[1][1]=2; ans[0][n-1]=m+2,ans[1][n-1]=n+m+1; ans[0][n>>1]=n|1,ans[1][n>>1]=n+(m<<1|1); ans[0][n]=(m+1)<<1,ans[1][n]=n+((m+1)<<1); for(rg int i=1;i<m;++i) { ans[0][n-(i<<1|1)]=2+i,ans[1][n-(i<<1|1)]=n-i+1; ans[0][n-(i<<1)]=n+i+1,ans[1][n-(i<<1)]=(n<<1|1)-i; ans[0][i<<1]=((m+1)<<1)-i,ans[1][i<<1]=((m+1)<<1)+i; ans[0][i<<1|1]=n+(m<<1|1)-i,ans[1][i<<1|1]=n+((m+1)<<1)+i; } } for(rg int i=1;i<=n;++i)printf("%d %d\n",ans[1][i],ans[0][i]); return 0; }
- 1
信息
- ID
- 6658
- 时间
- 2000ms
- 内存
- 128MiB
- 难度
- 6
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者