Hướng dẫn giải của TS10 Đắk Lắk 2023 - Bài 5

Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người làm lời giải.


Nộp code mẫu trước khi tự giải được bài tập là một hành vi có thể bị ban.

Gợi ý

  • Ta thấy ~1 \le x \lt y \le 10^{12}~ nên ~1 \le x^2, (x+1)^2, (x+2)^2, ..., y^2 \le 10^{24}~.
  • Với các số chính phương có ~i~ chữ số ta lấy căn bậc ~2~ của số lớn nhất có ~i~ chữ số là ~a_i~ (làm tròn xuống).
  • Ta có thể dễ dàng đếm được số chữ số của các số chính phương có ~i~ chữ số bằng cách đếm số số vừa thuộc ~[x, y]~ vừa thuộc ~[a_{i-1}+1, a_i]~ sau đó nhân cho ~i~.

Ví dụ: trong đoạn ~[3, 5]~ muốn đếm số số mà bình phương của nó thu được một chính phương có ~2~ chữ số thì ta có a[2] = 8, a[1] = 3 thì ta giao ~[3, 5]~ và ~[4, 9]~ sẽ được ~2~ phần tử là ~4~ và ~5~. Thật vậy ~4^2 = 16~, ~5^2 = 25~ là những số chính phương có ~2~ chữ số.

Code tham khảo

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

ll m, n;
ll a[30];
int main() {
    cin >> m >> n;
    ll ans = 0;
    for(int i= 1; i <= 24; i++){
        a[i] = sqrt(pow(10, i));
        if (i%2 == 0) a[i]--;
    }
    for(int i = 1; i <= 24; i++){
        ll x = a[i];
        if (x >= m) ans += (x-m+1)*i, m = x + 1;
        if (x >= n){
            ans -= (x-n)*i;
            break;
        }
    }
    cout << ans;
}

Bình luận

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


Không có bình luận tại thời điểm này.