2020牛客多校第六场E题Easy Construction(构造算法)

链接:https://ac.nowcoder.com/acm/contest/5671/E

题意:输入两个数n,k。构造一种新序列P[1-n] 满足每一种长度存在子串的和对n取余为k。输出序列P,若有多种随便输出一种即可,若不能构造,输入-1。

题解:通过举例我们可以很快发现其实很多n,k是不能满足的。我们取一种极端情况就是长度为n时的和对n取余是不是为k,就可以判断能不能构造。构造时,我们要考虑k是否为0。

若为0,我们先放n表示长度为1时满足条件,后面再放1,n-1 , 2,n-2 ....就可以构造序列P

若k不为0,我们就先放n,k表示长度为1和2满足条件,再放k-1,k+1,k-2,k+2....这样也构成序列P

 

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e6+7;
int a[maxn];
int main(){
    ll sum=0;
    int t,n,m,p,k;
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++){
        sum+=i%n;
    }
//    cout<<sum<<endl;
    if(sum%n!=k){
        puts("-1");
        return 0;
    }
    if(k==0){
        printf("%d",n);
        int cnt=0;
        for(int i=1;cnt<n/2;i++,cnt++){
            printf(" %d %d",i,n-i);
        }
        printf("\n");
    }else {
        printf("%d %d",n,k);
        int cnt=0;
        int sum=(n-2)/2;
        for(int i=1;cnt<sum  ;i++,cnt++){
            printf(" %d %d",k-i,k+i);
        }
        printf("\n");
        
    }
    return 0;
}

 

posted @ 2020-08-02 15:19  杰瑞与汤姆  阅读(198)  评论(0)    收藏  举报