地址:https://ac.nowcoder.com/acm/contest/5671/E
题意:
构造一个只含1~n的序列,使得对于每一个长度在[1,n]的i,序列都存在一段长度为i的连续子序列,它的和%n==k
解析:
正着看不好看,来倒着分析
首先是i==n的情况,也就是序列总和,如果它%n!=k,那肯定是不行的。
接下来就是一个猜测的过程了:
i固定时,尽量把sum弄大,防止小的sum凑不出来,这个也是根据画了好几种得出的,所以一定要勤动手啊。
所以就盲猜了一下构造方式,1,n-1,2,n-2.....直到把所有数填上,但是n奇偶不同,构造的过程在末尾有些不同。所以分开讨论即可。
而且根据图,n这个数字是一定要在两端的。
#include<bits/stdc++.h> #include<iostream> #include<cstring> #include<string.h> #include<cmath> #include<map> using namespace std; typedef long long ll; const int maxn=5e5+10; int a[maxn]; int vis[5005]; string s; int main() { // memset(vis,0,sizeof(vis)); int n,k; cin>>n>>k; if(n==1) { cout<<"1"<<endl;return 0; } ll sum=(ll)(n*n+n)/2; if(sum%n!=k) { cout<<"-1"<<endl;return 0; } if(n%2==0) { for(int i=1;i<n/2;i++) cout<<i<<" "<<n-i<<" "; cout<<n/2<<" "<<n<<endl; } else { for(int i=1;i<=n/2;i++) cout<<i<<" "<<n-i<<" "; cout<<n<<endl; } }