2020牛客多校第六场 E

题意:给你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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值