题意:给你n,k 求是否存在一个 1~n 的某种排列P,使得存在长度为i i属于[1,n] 的连续子序列 的 sum % n == k
对于i等于 n的时候 ,作为突破口,由公式 n*(n+1)/2 可以知道
n 为 奇数的时候 : 结果是n的倍数,所以k应该为0.
look look ((n+1)/2 % n) x (n % n) = 0
n 为 偶数的时候: 结果为 n/2 . 再 look look ( (n+1)%n X (n/2) % n) = n/2
这样就可以判断出是否可以构造了,接下来是怎么构造。
n 是奇数的时候: 已经知道k 为 0 了,肯定让任意的连续子序列相加都是n的倍数。当取两个数的时候,我们可以构造 i,和n-i, 3个,那就 i,n-i,n,4个 i,i+1,n-i,n-i+1 …
在这里,把n放在最后一个位置,就能得到所有情况
当n是偶数的时候: k已经是n/2了,当取两个数,n/2,n, 3个 i,n-i,n/2. 4个数
i,i+1,n/2,n …
同样,把n/2 和 n放在后面。
代码:
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#include<bits/stdc++.h>
#define int long long
#define sc scanf
#define pf printf
using namespace std;
typedef pair<int,int> pii;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const double eps = 1e-4;
const int mod = 1e9+7;
const int N = 1010;
signed main(){
// IOS;
#ifdef ddgo
freopen("C:/Users/asus/Desktop/ddgoin.txt","r",stdin);
#endif
int n,k; cin>>n>>k;
if(n & 1){
if(!k){
for(int i=1;i<=n/2;i++) cout<<i<<" "<<n-i<<" ";
cout<<n<<endl;
}else cout<<-1<<endl;
}else{
if(k == n/2){
for(int i=1;i<n/2;i++) cout<<i<<" "<<n-i<<" ";
cout<<n/2<<" "<<n<<endl;
}else cout<<-1<<endl;
}
return 0;
}