ACM模版

描述

题解

这个题是一个构造体,只要发现了其中构造的规律即可。

一开始我画了半天 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;
}