题意
给定 n,k,问是否可以构造一个 1~n 的排列 P,使得对于 1~n 中任意的数 i,P 都存在一个
长为 i 的子区间,其和模 n 余 k。有解输出任意一组,无解输出 -1。
思想:分 奇偶讨论可以依次添加,偶数只有k=(n+1)*n/2%k 奇数只有k=0
#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
const int INF=0x3f3f3f3f;
const double pi=acos(-1),eps=1e-8;
int vis[5005];
void f(int x,int k){
int tmp=(x*(x+1)/2)%x;
cout<<x<<" "<<tmp<<" ";
for(int i=tmp-1;i>0;i--){
cout<<i<<" "<<x-i<<" ";
}
//cout<<endl;
}
void f2(int n){
cout<<n<<" ";
for(int i=1;i<=n/2;i++){
cout<<i<<" "<<n-i<<" ";
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
// freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
int n,k;
cin>>n>>k;
if(n%2==0 && n*(n+1)/2%n==k){
f(n,k);
}else if((n&1)&&k==0){
f2(n);
}else{
cout<<"-1";
}
return 0;
}