HSG THPT Thanh Hóa 2022 - Mật Mã

View as PDF

Submit solution


Points: 0.15 (partial)
Time limit: 1.0s
Memory limit: 256M
Input: MATMA.INP
Output: MATMA.OUT

Author:
Problem type
Allowed languages
C, C++, Go, Java, Kotlin, Pascal, PyPy, Python, Rust, Scratch

Trên một vách đá có ghi rất nhiều các con số bí ẩn mà chúng có mối liên hệ với số ~30~. Sau một thời gian nghiên cứu, các chuyên gia đã tìm được cách giải mã các số đó như sau: Hoán vị các chữ số của số bí ẩn để thu được một bội số lớn nhất của ~30~.

Hãy viết chương trình để giúp các chuyên gia giải mã các số bí ẩn đó.

Input

Cho trong tệp MATMA.INP gồm một dòng duy nhất chứa số nguyên dương ~N~, với ~N~ có tối đa ~10^7~ chữ số là số cần giải mã.

Output

Ghi ra tệp MATMA.OUT một số nguyên duy nhất, là số lớn nhất chia hết cho ~30~, tìm được bằng cách hoán vị các chữ số của ~N~. Nếu không tìm thấy thì đưa ra ~-1~ (âm một).

Sample Input 1

1002

Sample Output 1

2100

Sample Input 2

12498567859

Sample Output 2

-1

Notes

  • Ở ví dụ đầu tiên, số ~2100~ là hoán vị lớn nhất của số ~1002~ và chia hết cho ~30~.

  • Ở ví dụ thứ hai, không tồn tại số hoán vị nào chia hết cho ~30~.


Comments

Please read the guidelines before commenting.



  • 0
    pdinhvinh815  commented on Jan. 12, 2026, 8:57 a.m. edited

    Để hoán vị chia hết 30 thì nó phải chia hết cho 3 và 10 , như vậy tổng cách phần tử trong hoán vị phải chia hết cho 3 , và trong hoán vị ít nhất có 1 chữ số 0 . Nếu thoả mãn các đk trên, chỉ cần sort giảm dần và in ra là đc


  • 0
    BaNguyz16  commented on Dec. 12, 2025, 1:18 p.m.

    include <bits/stdc++.h>

    using namespace std; int main(){ if(fopen("matma.inp","r")){ freopen("matma.inp","r",stdin); freopen("matma.out","w",stdout); } iosbase::syncwith_stdio(0); cin.tie(0);cout.tie(0); string s; cin>>s; if(s.find('0')==string::npos){ cout<<-1; return 0; } long long sum=0; for(int i=0;i<s.size();i++){ char c=s[i]; sum+=c-'0'; } if(sum%3!=0){ cout<<-1; return 0; } sort(s.rbegin(),s.rend()); cout<<s; return 0; }


  • -1
    NKhangIT  commented on Sept. 4, 2025, 1:23 p.m.

    test mạnh thí


  • 2
    lanMX  commented on Aug. 2, 2025, 1:49 p.m.

    em xin góp cách làm ạ

    sort s.begin(),s.end(),greater<char>(),kiểm tra xem *s.end() có bằng 0 và tổng các chữ số của s có chia hết cho 3 không , nếu có in ra s sau khi sort ngược lại in ra -11

    code mẫu

    https://onlinegdb.com/GrQKIZOzu


  • 1
    p200001951  commented on May 4, 2025, 4:31 a.m.

    Spoil Một số chia hết cho 30 thì phải chia hết cho 3 và 10 => Cộng các phần tử lại => Nếu như tổng các số đó % 3 == 0 và có số 0 trong đó thì kết quả là N sau khi sort => Nếu ko thì cout -1


  • -4
    HieuTrong  commented on Nov. 19, 2024, 7:13 a.m.

    include <bits/stdc++.h>

    using namespace std;

    int a[10000007],n; long long t=0,d=0;

    int main() { string s; cin >> s; for (int i = 0; i < s.size(); i++) { a[i] = s[i] - '0'; } n=s.size(); sort(a,a+n,greater<int>()); for(int i=0;i<n;i++) { t+=a[i]; if(a[i]==0) d++; } if(t%3==0 && d>0) { for(int i=0;i<n;i++) { cout<<a[i]; } } else { cout<<-1; } return 0; }

    vì sao em code này ko ra ạ


    • -7
      behoang0302  commented on Aug. 27, 2025, 7:55 a.m.

      This comment is hidden due to too much negative feedback. Show it anyway.


  • 0
    hoduckhoinguyen09  commented on Sept. 16, 2024, 9:42 a.m. edited

    .


  • 10
    mai_mai_1_tink_iu  commented on Feb. 6, 2024, 4:55 a.m. edited

    Cách giải:

    Một hoán vị không thể chia hết cho 30 nếu nó không chia hết cho 3, 2 và 5.

    Để chia hết cho 2 và 5 thì trong hoán vị đó phải có số 0.

    Kết quả là số N sau khi sort giảm dần.