牛客多校(2020第六场)E Easy Construction

示例1

输入

2 1

输出

1 2

说明

The sum of subintervals [1],[1,2][1],[1,2][1],[1,2] both satisfy ≡1(mod2), and their lengths are 1,21,21,2 respectively.
示例2

输入

3 1

输出

-1

题解:

  • 如果有解,那么 n(n+1)/2 % n == k,因为长度为n的子区间是P本身,P的元素之和为n(n+1)/2.
  • 假设k满足上述条件,此时一定有解。如果是奇数,则k=0,则P={n, 1, n-1, 2, n-2, ..},若为偶数,则P={n, n/2, 1, n-1, 2, n-2, ...}
 1 #include<iostream>
 2 using namespace std;
 3 
 4 int n, k;
 5 
 6 void solve() {
 7     cin >> n >> k;
 8     int sum = n * (n+1) / 2;
 9     if (sum % n != k)   cout << "-1\n";
10     else {
11         if (n % 2 == 0) {
12             cout << n << " " << n / 2;
13             for (int i = 1; i <= n/2 -1; i++) {
14                 cout << " " << i << " " << n - i;
15             }
16         }
17         else {
18             cout << n;
19             for (int i = 1; i <= n/2; i++) {
20                 cout << " " << i << " " << n - i;
21             }
22         }
23     }
24 }
25 
26 int main() {
27     solve();
28     cout << "\n";
29     return 0;
30 }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值