Easy Construction
这是牛客2020暑期多校第六场的E题
题目大意是给我们n长的1-n的序列,让我们构造使得这个序列任意长度sum都存在,长度为sum的序列和取余n为k;
粗看题目大意感觉是道难题,但是分析一下可以得到以下结论:
(1)如果n为奇数,那么长度为n的总和为(n+1)*n/2,那么取余n,必定为0。这就是说n为奇数,k为0;
(2)如果n为偶数,那么长度为n的总和为(n+1)*n/2,那么取余n,必定为n/2。这就是说n为偶数,k为n/2;
接着如果都满足条件,那么我们就要开始构造这个序列让他满足我们的需求:
(1)首先开始构造奇数,奇数情况下,k为0,那么我们保证第一位是n,就确保了长度sum=1时有效,然后我们把
剩下的数两两凑对,i=1和n-i凑一对,那么sum=2是就满足条件,3的时候就是加上第一位,然后凑上i=2和n-i,和i=1与n-i,
这样就满足4位,同理......就构造完成
(2)偶数情况下,k=n/2,那我们的核心就是围绕n/2 ,然后剩下的两两凑对构成n,和奇数一样即可,唯一的问题是n这个数
的位置要怎么办,我们把它放到第一位,这样方便我们凑sum=2,也不影响sum=3,因为我们的3是要保证n/2和i=1与n-1相结合
所以把n放到第一位即可构造成功。
然后附上代码:
#include<stdio.h> #include<string.h> #include<math.h> #include<iostream> #include<algorithm> #include<queue> #include<vector> #define ll long long using namespace std; int main() { int n, k; cin >> n >> k; if (n % 2 == 1) { if (k != 0) { cout << "-1" << endl; } else { cout << n << " "; for (int i = 1; i <= n / 2; i++) { cout<<" " << i << " " << n - i; } } } else { if (k != n / 2) { cout << "-1" << endl; } else { cout << n << " " << k; for (int i = 1; i < n / 2; i++) { cout << " " << i << " " << n - i; } } } }