Nhân

Xem PDF

Điểm: 1100 (p) Thời gian: 1.0s Bộ nhớ: 256M Input: bàn phím Output: màn hình

Nhân thích học toán. Đương nhiên là Nhân cũng thích nhân. Đối với Nhân, mọi thứ đều có thể biểu diễn được dưới dạng những con số. Hôm nay, Nhân đã gặp phải \(n\) sự vật sự việc khác nhau và cậu đã ghi vào nhật kí của mình một dãy \(a\) gồm \(n\) số tượng trưng cho những thứ ấy.
Để đánh giá mỗi ngày trôi qua tốt hay xấu, Nhân sẽ dựa vào một con số. Số này được tính bằng: Nhân sẽ nhân toàn bộ \(n\) số của ngày hôm đó lại. Nếu tích này vượt quá \(10^{18}\), Nhân sẽ coi như con số đó là \(-1\).
Tuy nhiên khá xui là Nhân đã bỏ quên máy tính ở trường nên không thể nhân được! Bạn hãy nhân giúp Nhân số trên (cho ngày hôm nay) nhé.

Input

  • Dòng đầu tiên chứa \(n\) \((2 \le n \le 10^5)\): độ dài dãy
  • Dòng tiếp theo chứa \(n\) số nguyên không âm \(a_1, a_2, a_3, \dots, a_n (0 \le a_i \le 10^{18})\)

Output

  • Dòng duy nhất chứa tích theo mô tả của đề bài

Test 1

Input
2
1000000000 1000000000
Output
1000000000000000000
Note

Tích bằng đúng \(10^{18}\)

Test 2

Input
3
999999000001 9901 101
Output
-1
Note

Tích tạo được là \(10^{18} + 1 > 10^{18}\) nên đáp án là \(-1\)


Bình luận


  • 3
    lehongduc    10:11 p.m. 29 Tháng 7, 2024 đã chỉnh sửa
    solution

    s khởi tạo bằng 1
    chạy từ a[0] đến a[n-1]
    nếu kích thước của s cộng cho kích thước của a[i] đang xét trừ đi 2 mà lớn hơn 18 hoặc s nhân với a[i] lớn hơn 10^18 thì cout<<-1 và return 0;
    nếu không thì nhân s với a[i]
    xong xuất s là dc
    do 6 test cuối có số 0 ở cuối nên phải sort tăng dần trước khi test để tránh ra kết quả -1

    code C++
    #include<bits/stdc++.h>
    #define ll long long
    using namespace std;
    int main()
    {
        ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
        ll n;
        cin>>n;
        ll a[n];
        for(ll i=0;i<n;i++)
        {
            cin>>a[i];
        }
        sort(a,a+n);
        string dodais,dodaia;
        ll s=1;
        for(ll i=0;i<n;i++)
        {
            if(a[i]==0||s==0) s=0;
            else
            {
                dodais=to_string(s);
                dodaia=to_string(a[i]);
                if((ll)(dodais.size()+dodaia.size())-2>18||s*a[i]>1000000000000000000)
                {
                    cout<<-1;
                    return 0;
                }
                else s*=a[i];
            }
        }
        cout<<s;
    }
    

    • -2
      PY2BPhamQuangMinh    3:26 p.m. 10 Tháng 6, 2024 đã chỉnh sửa

      ko có code đâu

      1 phản hồi

      • 1
        Avocadorable    5:58 p.m. 8 Tháng 5, 2024 chỉnh sửa 5

        [comment deleted]


        • 1
          dangnha2k3    2:03 p.m. 3 Tháng 3, 2024
          Hint

          6 test cuối số 0 nằm ở cuối dãy, nên khi kết quả > 10^18 chương trình sai sẽ dừng lại mà không xét hết đầu vào.


          • 1
            Thiện2011    8:53 p.m. 21 Tháng 2, 2024

            6 text cuối phải là -1 chứ sao lại là 0

            1 phản hồi

            • 3
              doraemon    5:10 p.m. 11 Tháng 2, 2024

              mấy test cuối sai rồi
              phải là -1 chứ sao lại là 0

              1 phản hồi