题目大意
给定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; }