题目大意

给定n,k,构造一个1-n的排列P,使得对于1-n中的每个i,P都存在一个长为i的子序列,而每个子序列的和模n都余k。有解则输出任意P,无解输出-1。

解题思路

(做题的时候我和队友花了好久,试图凑出一种看起来靠谱的通用方案,没想到还真能歪打正着)
因为长度为n的子区间只有P本身,而所有的子区间和都各自模n余k,等量代换,所以所有数的总和模n必须余k。如果1-n的总和(n(n+1)/2)%n==k,那么就一定有解决方案。

但是n确定了,不确定的k也会带来麻烦,我们似乎需要针对每对n,k指定动态的解决方案。看起来这题很困难啊。
但是,稍微列几组数据就会发现,当n为奇数时,1-n的和必定是n的倍数,即k一定为0;而当n为偶数时,k一定为n/2

如果一定有解决方案,那么如何构造这样一个排列也是一个问题。经过试验,我们得出一种通用方案:
如果n%2==1,那么k=0,令P={n,,1,n-1,2,n-2,...}
如果n%2==0,那么k=n/2,令P={n,n/2,1,n-1,2,n-2,...}

AC代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,k;
    scanf("%d%d",&n,&k);
    if(n%2)
    {
        if(!k)
        {
            for(int i=1;i<=n/2;i++) printf("%d %d ",i,n-i);
            printf("%d",n);
        }
        else printf("-1");
    }
    else
    {
        if((n*(n+1)/2)%n==k)
        {
            for(int i=1;i<n/2;i++) printf("%d %d ",i,n-i);
            printf("%d %d",n/2,n);
        }
        else printf("-1");
    }
    return 0;
}