MAGPERM - Hoán vị thần kì

Xem dạng PDF

Gửi bài giải


Điểm: 1,00 (OI)
Giới hạn thời gian: 1.0s
Giới hạn bộ nhớ: 1G

Tác giả:
Dạng bài
Ngôn ngữ cho phép
C, C#, C++, Go, Java, Pascal, Perl, PHP, PyPy, Python, Ruby, Rust, Scratch, Swift

Cho một mảng ~A~ gồm ~N~ phần tử và 1 số ~K~, các phần tử của mảng ~A~ được đánh số từ ~1~ đến ~N~. Gọi một hoán vị của mảng ~A~ là mảng ~B~. Hãy viết chương trình tìm xem liệu có hoán vị ~B~ nào thỏa mãn:

  • Các phần tử ở cùng một vị trí trong cả ~A~ và ~B~ đều có chênh lệch bằng ~K~.

Ví dụ: Cho một mảng gồm ~4~ phần tử ~A = [1, 2, 3, 4]~ , ~K = 2~ . Thì ta tìm được một hoán vị ~B = [3, 4, 1, 2]~ thõa mãn điều kiện đề bài vì:

  • Ta có ~B[0] - A[0] = 3 - 1 = 2~
  • Ở các vị trí khác ta có ~A[2] - B[2] = 3 - 1 = 2~, tương tự với các vị trí còn lại.

Input

  • Dòng 1 chứa số ~N~ là độ dài của mảng và 1 số ~K~

Biết rằng

  • ~1 \le N \le 10^5~
  • ~ 0 \le K < N~

Output

  • Nếu có hoán vị ~B~ nào thỏa mãn đề bài, in ra hoán vị ~B~ đó, mỗi phần tử cách nhau 1 dấu cách.
  • Nếu không có hoán vị ~B~ nào thỏa mãn đề bài, in ra ~-1~ .

Sample

Input #1
2 1
Output #1
2 1
Input #2
3 1
Output #2
-1
Input #3
3 0
Output #3
1 2 3

Bình luận

Please read the guidelines before commenting.



  • 0
    DongHai1412  đã bình luận lúc 1, Tháng 3, 2026, 9:41

    C++ Full AC

    include <bits/stdc++.h>

    using namespace std;

    typedef long long ll;

    ll a[100005], b[100005]; ll n, k;

    int main(){ iosbase::syncwith_stdio(false); cin.tie(0), cout.tie(0);

    cin >> n >> k;
    
    if(k == 0){
    
        for(ll i = 1; i <= n; i++) cout << i << '\n';
    
    }
    
    else{
    
        if(n % (2 * k) != 0){
    
            cout << -1 << '\n';
    
        }
    
        else{
    
            for(ll i = 1; i <= n; i += (2 * k)){
    
                for(ll j = i + k; j <= i + (2 * k) - 1; j++){
    
                    cout << j << " ";
    
                }
    
                for(ll j = i; j <= i + k - 1; j++){
    
                    cout << j << " ";
    
                }
    
            }
    
        }
    
    }
    
    return 0;
    

    }


  • 0
    top1devc  đã bình luận lúc 28, Tháng 12, 2025, 19:39 sửa 3

    CODE C FULL AC

    #include <stdio.h>
    
    int main (){
    
    int a[100000],n,i,k;
    scanf("%d",&n);
    scanf("%d",&k);
    for (i=0;i&lt;n;i++){
        a[i]=i+1;
    }
    if (k==0){
            for (i=0;i&lt;n;i++){
        printf("%d ",a[i]);
    }
    }
    else if (n%k!=0){
        printf("-1");
    }
    else if (n%2!=0){
        printf("-1");
    }
    else if ((n/(k))%2!=0) {
            printf("-1");
    }
    else {
            for (i=0;i<(n/2);i++){
                int x = i+(int)(i/k)*k;
                int y = i+(int)(i/k)*k + k;
                a[x] += k;
                a[y] -= k;
                }
            for (i=0;i< n;i++){
                printf("%d ",a[i]);
                }
            }
    return 0;
    }
    

  • -8
    Nguyenhoang150908  đã bình luận lúc 10, Tháng 10, 2025, 0:47

    Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.


  • 0
    khoihahaha  đã bình luận lúc 3, Tháng 6, 2025, 13:36 chỉnh sửa

    khó quá


  • -1
    skibiditoiletdomdomyesyes  đã bình luận lúc 6, Tháng 11, 2024, 1:38

    người ta tự làm xong người ta giải thích chứ đâu bạn :))


  • -2
    longzuhaun  đã bình luận lúc 29, Tháng 2, 2024, 10:21

    mn ai giảng e vs