描述
题解
这个题是一个构造体,只要发现了其中构造的规律即可。
一开始我画了半天 n=5 的情况,发现怎么找也找不出来可行解。于是尝试 n=6 的情况,找到了一组可行解 3 5 2 4 1 ,然后大胆的猜测,每隔一项差为1,注意取模,并且第二项为最大值,这样,只有当多边形是奇数边时才可以保证每一个边符合关系,那么也就意味着当点数 n 为奇数时无解。抱着侥幸心理直接写了一下,却 judge error 了……于是找了一下 JinbaoSite 的题解,发现我的确猜对了(具体推导过程请查看大神的题解吧),于是我尝试提交了一下该大神的代码,依然 judge error 让我很痛心……接着我花了 60 点头盾买了一个大神的 AC 代码瞅瞅,发现和我们思路是一样的,可是提交依然是 judge error,哎,我放弃了,因为问题不是我们的,网站可能出 bug 了吧……希望夹克老师能尽快解决这个问题,心疼我的点头盾啊……
注意,由于这个问题需要用到大量的输出,所以记住开输出外挂哦……
代码
#include <cstdio>
#include <iostream>
using namespace std;
const int MAXN = 1e6 + 10;
const int MAXM = 10;
const int MAX_BUFF = 1 << 24;
int A[MAXN];
char s[MAX_BUFF];
char tmp[MAXM];
void intToChar(int &pos, int a)
{
int cnt = 0;
while (a)
{
tmp[cnt++] = a % 10;
a /= 10;
}
while (cnt != 0)
{
s[pos++] = tmp[--cnt] + '0';
}
}
int main()
{
int n;
cin >> n;
n--;
if (n % 2 == 0)
{
cout << 0 << '\n';
return 0;
}
int k = 1, num = n;
while (1)
{
A[k] = num--;
if (k == n - 1)
{
break;
}
k = (k + 2);
if (k >= n)
{
k -= n;
}
}
int pos = 0;
for (int i = 1; i < n; i++)
{
intToChar(pos, i);
s[pos++] = ' ';
}
intToChar(pos, n);
s[pos++] = '\0';
puts(s);
pos = 0;
for (int i = 0; i < n - 1; i++)
{
intToChar(pos, A[i]);
s[pos++] = ' ';
}
intToChar(pos, A[n - 1]);
s[pos++] = '\0';
puts(s);
return 0;
}