---
# System prepended metadata

title: Bedao Mini Contest 06 - INTERNET
tags: [' Constructive', ' Bedao', ' Quaternary', VNOJ, ' Implementation', ' SPyofgame']

---

---
tags: VNOJ, Bedao, Implementation, Constructive, Quaternary, SPyofgame
---

Bedao Mini Contest 06 - INTERNET
===

[https://oj.vnoi.info/problem/bedao_m06_internet](https://oj.vnoi.info/problem/bedao_m06_internet)

-----

###### Tags: `Implementation`, `Constructive`, `Quaternary`

-----

### Trường hợp $s = 1$

Ta chỉ cần in số $0$ vì số đó là số hệ tứ phân đối xứng nhỏ nhất

-----

### Trường hợp $s > 1$:

Vì số không được có số $0$ vô nghĩa nên ta sẽ chọn chữ số ở đầu là $1, 2$ hoặc $3$ nếu có đủ và ưu tiên số nhỏ hơn, vì số đối xứng nên chữ số ở cuối cũng phải là chữ số ở đầu. Lưu ý rằng cần ít nhất $2$ chữ số để đủ. Nếu không tồn tại thì in **"Bedao!"** và dừng chương trình

Sau khi điền ở đầu, ta điền từ ở giữa ra, ta ưu tiền điền các chữ số lớn nhất vì lúc này các số càng gần về phía trái (tức hệ số lớn hơn) sẽ có chữ số nhỏ hơn. Lưu ý những phần chưa được điền số ta gán hết bằng $0$ và không điền ra tới ngoài biên

Nếu như $s$ lẻ ta sẽ chon chữ số lớn nhất mà số lượng của nó còn lại lẻ lần vì những vị trí khác phải điền theo cặp. Lưu ý nếu ta không tìm được chữ số hợp lệ thì ta điền số $0$

Nếu sau quá trình điền vẫn còn dư $A$ hoặc $B$ hoặc $C$ không tồn tại thì in **"Bedao!"** và dừng chương trình

Ngược lại xuất ta cần tính giá trị của số vừa được xây in modulo. Để làm điều đó, ta khởi tạo $v = 0$ và duyệt qua từng chữ số $x$ hệ tứ phân theo trái qua phải, gán $v := (v * 4 + x)\mod\ 727355608$

Vậy độ phức tạp bài này là $O(s)$

-----

### Code

> **Time:** $O(s)$
> **Space:** $O(s)$ 
> **Algo:** Implementation, Constructive, Quaternary

```cpp=
#include <iostream>
#include <vector>

using namespace std;

const int MOD = 727355608;
int main()
{
    /// Input
    int s, a, b, c;
    cin >> s >> a >> b >> c;
    
    /// De code gon hon
    int cnt[4];
    cnt[1] = a;
    cnt[2] = b;
    cnt[3] = c;

    /// TH dac biet
    if (s == 1)
    {
        cout << 0;
        return 0;
    }
    
    /// So he tu phan
    vector<int> x(s, 0);
    for (int v = 1; v <= 4; ++v)
    {
        /// Neu du so luong 
        if (cnt[v] >= 2)
        {
            cnt[v] -= 2;
            x.front() = v; 
            x.back() = v;
            break;
        }
    }
    
    /// Khong tim duoc cach chon so dau tien thoa man
    if (x.front() == 0) 
    {
        cout << "Bedao!";
        return 0;
    }
    
    /// Xay tung chu so tu giua ra
    for (int l = (s - 1) / 2, r = s / 2; 0 < l && r < s; --l, ++r)
    {
        if (l == r)
        {
            for (int v = 3; v >= 1; --v)
            {
                if (cnt[v] % 2 == 1) /// Chi uu tien chon so bi le ra
                {
                    --cnt[v];
                    x[l] = v;
                    break;
                }
            }

            continue;
        }
        
        /// Uu tien xay tu giua ra ngoai bien nen se uu tien gia tri cang to cang tot
        for (int v = 3; v >= 1; --v)
        {
            if (cnt[v] >= 2)
            {
                cnt[v] -= 2;
                x[l] = x[r] = v;
                break;
            }
        }
    }   

    /// Khong xay dung duoc so thoa man
    if (cnt[1] || cnt[2] || cnt[3])
    {
        cout << "Bedao!";
        return 0;
    }

    /// Tinh ket qua modulo
    int res = 0;
    for (int v : x) res = (4LL * res | v) % MOD;
    
    /// Output
    cout << res;
    return 0;
}
```