POF3 - Lũy thừa của 3

Xem dạng PDF

Gửi bài giải

Điểm: 2,00 (OI)
Giới hạn thời gian: 0.05s
Giới hạn bộ nhớ: 256M

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

Cho số thực ~N~, hãy cho biết ~N~ có phải là lũy thừa của ~3~ hay không?

Lưu ý: Trường hợp ~N~ là số thực, kết quả chấp nhận sai số ~\epsilon \le 10^{-15}~

Input

  • Dòng đầu tiên ghi số ~N (0 \le N \le 10^{18}).~

Output

  • Nếu ~N = 3^k~ (~k~ là số nguyên) thì in ra ~k~, ngược lại thì in ra NO.

Sample

Input #1
9
Output #1
2
Input #2
3
Output #2
1
Input #3
16677181699666570
Output #3
NO

Bình luận

Hãy đọc nội quy trước khi bình luận.



  • 1
    dinhvantung0611  đã bình luận lúc 22, Tháng 1, 2024, 13:26 sửa 7

    Ý tưởng: Cái này mình áp dụng toán, cụ thể là dùng log:

    Ví dụ ta có log3(9) = 2. Cái bây giờ ta cần là làm sao để có cái hàm log3 (C++ không có, hoặc do mình không biết :)). Ta sử dụng t/c của hàm log: logc(a) / logc(b) = logb(a) (c nguyên, bất kì). Như vậy ta sẽ có logc(9) / logc(3) = log3(9). Bài làm của mình dùng log10l (long double).

    Như vậy tổng quát ta sẽ có: long double k = log10l(n) / log10l(3).

    Lúc này ta có 3 trường hợp từ dữ liệu đầu vào:

    TH1: n >= 1 => k >= 0 tức là ta chỉ cần check xem k có phải số nguyên dương (0, 1, 2, ...) hay không rồi in ra màn hình k nguyên là được.

    TH2: n là số thực (0 < n < 1) => k < 0 mà bài cho n có sai số là -10^15, cho nên ta sẽ phải biểu diễn k có sai số là -10^15 bằng cách sử dụng hàm round làm tròn đến chữ số thập phân thứ 15, k = round(k * 10^16) / 10^16.

    TH3: Không thoả mãn, in ra "NO" thôi.

    CƯỜNG GIẢ HỌ ĐINH. VẠN CỔ TỐI CƯỜNG


    • 0
      dinhvantung0611  đã bình luận lúc 24, Tháng 1, 2024, 9:33 sửa 13

      long double n;

       cin >> n;
       long double k = round(log10l(n) / log10l(3) * 1e16) / 1e16;
       if (n >= 1 && ceil(k) == floor(k))
            cout << ll(k);
       else if (0 < n && n < 1 && k < 0)
            cout << k;
       else
            cout << "NO\n";
      

    • 1
      dinhvantung0611  đã bình luận lúc 22, Tháng 1, 2024, 13:36

      Trong lập trình các phép toán như log, căn, mũ,... có mối liên hệ và rất tiện, hay được sử dụng. Các bạn chú ý phần kiến thức đó sẽ dễ dàng giải các bài code liên quan.

      CƯỜNG GIẢ HỌ ĐINH. VẠN CỔ TỐI CƯỜNG


  • 0
    vinh1e2kg  đã bình luận lúc 22, Tháng 1, 2024, 12:06

    Nên cho test mẫu có số thực


  • 0
    copy_paste  đã bình luận lúc 22, Tháng 8, 2023, 11:26

    chỉnh lại cho ông dùng py3 à haha


    • -5
      Hieu Nguyen  đã bình luận lúc 30, Tháng 8, 2023, 9:59

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


  • 1
    kien  đã bình luận lúc 21, Tháng 8, 2023, 7:16

    Chỉnh lại time limit với ạ