DSCP - Đếm số chính phương

Xem dạng PDF

Gửi bài giải


Điểm: 1,00 (OI)
Giới hạn thời gian: 1.0s
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, PyPy, Python, Ruby, Rust, Scratch, Swift

Hôm nay Tí được học về số chính phương, đó là những số là bình phương của một số tự nhiên (chẳng hạn ~0, 1, 4, 9, 16…~).

Tí rất thích số chính phương và Tí muốn đếm xem giữa hai số nguyên dương ~L, R~ bất kỳ có bao nhiêu số chính phương (tức là những số chính phương ~n~ mà ~L ≤ n ≤ R~). Em hãy giúp Tí lập một chương trình giải quyết việc đó nhé.

Input

  • Một dòng duy nhất chứa hai số nguyên dương ~L, R~ cách nhau bởi một dấu cách.

Giới hạn:

  • ~40\%~ số test có ~1 ≤ L ≤ R ≤ 10^4~
  • ~40\%~ số test có ~1 ≤ L ≤ R ≤ 10^8, R – L ≤ 10^5~
  • ~20\%~ số test có ~1 ≤ L ≤ R ≤ 10^{12}, R – L ≥ 10^9~.

Output

  • Một dòng duy nhất ghi số số chính phương nằm giữa ~L~ và ~R~

Sample

Input #1
2 5
Output #1
1
Input #2
3 25
Output #2
4

Hint

  • Trong ví dụ ~1~, có duy nhất một số chính phương nằm giữa ~2~ và ~5~ là số ~4~
  • Trong ví dụ ~2~, có bốn số chính phương nằm giữa ~3~ và ~25~ là số ~4~, ~9~, ~16~, ~25~

Problem source: Chuyên Sơn La Online Judge


Bình luận

Please read the guidelines before commenting.



  • 0
    DongHai1412  đã bình luận lúc 21, Tháng 6, 2026, 9:30

    cái này có công thức nha: C++

    include <bits/stdc++.h>

    using namespace std;

    typedef long long ll;

    ll l, r;

    int main(){ iosbase::syncwith_stdio(false); cin.tie(0), cout.tie(0);

    cin >> l >> r;
    
    cout << ll(sqrt(r)) - ll(sqrt(l - 1)) << '\n';
    
    return 0;
    

    }


  • 1
    dizionrlxno1  đã bình luận lúc 29, Tháng 4, 2026, 10:54

    include <bits/stdc++.h>

    define ll long long

    using namespace std; ll a,b,A,B,S=0; int main() { cin>>a>>b; A=sqrt(a); B=sqrt(b); for(ll i=A-1;i<=B;i++){ if(ii>=a && ii<=b){ S++; } } cout<<S; return 0; }


  • 0
    TwoTime  đã bình luận lúc 1, Tháng 4, 2026, 11:52

    include <iostream>

    include <cmath>

    using namespace std;

    int main() { // Tối ưu tốc độ nhập xuất iosbase::syncwith_stdio(false); cin.tie(NULL);

    long long L, R;
    if (!(cin >> L >> R)) return 0;
    
    // Tìm căn bậc hai của L và R
    // Dùng ceil cho L để lấy số nguyên lớn hơn hoặc bằng căn L
    // Dùng floor cho R để lấy số nguyên nhỏ hơn hoặc bằng căn R
    long long start = ceil(sqrt(L));
    long long end = floor(sqrt(R));
    
    // Nếu start > end thì không có số chính phương nào
    if (start > end) {
        cout << 0 << endl;
    } else {
        long long count = end - start + 1;
        cout << count << endl;
    }
    
    return 0;
    

    }

    dành cho bạn nào chưa biết thì cái này gemini làm hộ tôi dùng tốt cực


  • -4
    lavacasatunita  đã bình luận lúc 18, Tháng 3, 2026, 10:51

    như này này

    con c*c đù má mày tự làm đi thằng ngu si


  • 1
    congtyluuthaibao1978  đã bình luận lúc 25, Tháng 11, 2025, 11:40

    include <bits/stdc++.h>

    using namespace std; long long a,b,A,B,dem=0; int main() { cin>>a>>b; A=sqrt(a); B=sqrt(b); for(long long i=A-1;i<=B;i++) { if(ii>=a && ii<=b) { dem++; } } cout<<dem; return 0; }


  • 1
    Duong_Thanh_Khiem_L8  đã bình luận lúc 18, Tháng 11, 2025, 15:28 chỉnh sửa

    Ai làm full AC không cho mình xin code


  • 1
    Mine2090  đã bình luận lúc 2, Tháng 3, 2025, 14:38

    như này image.png


  • 1
    Mine2090  đã bình luận lúc 2, Tháng 3, 2025, 14:36

    a=sqrt(L) & b=sqrt(r) chạy i từ a-1 đến b kt a <= i*i <=b


  • 1
    daylatuu  đã bình luận lúc 17, Tháng 10, 2024, 8:42

    bài này các bạn có thể làm bằng cách lấy sqrt(r) - sqrt(l) + (sqrt(l) * sqrt(l) == l)


  • 2
    minhducyl156  đã bình luận lúc 30, Tháng 5, 2024, 14:47

    bạn làm như này thì sẽ bị quá thời gian vì trong 1s máy tính không thể xử lí quá 10^8 phép tính mà đề bài cho 10^9 nên bị tle


  • 1
    lch101  đã bình luận lúc 25, Tháng 4, 2024, 10:26

    khi duyệt từ sqrt(l) -> sqrt(r) mn cần chú ý case sau: 10->100 nếu lấy sqrt --> 3->10 mà 3^2 = 9 thì không nằm trong khoảng 10->100 Vậy thì left sau khi khai căn cần lấy cận trên để nó ko bị làm tròn xuống.


  • 1
    dungolduck  đã bình luận lúc 11, Tháng 2, 2024, 7:31

    bài này mấy bạn chỉ cần duyệt từ cận trên của n=sqrt(l) đến m=sqrt(r) sau đó lấy m-n+1 là đc