[GESP202603 五级] 有限不循环小数

终止数:分解质因数后只存在2和5的数字

数论

由以上定义,我们可以先将10^6以内所有符合条件的数字找出来,再从题目要求的范围[L,R]中统计出具体的个数。

#include <bits/stdc++.h>
using namespace std;

int main() {
    int l, r;
    cin >> l >> r;
    const int MAX = 1e6;
    set<int> nums; // 排序并去重

    // 生成所有不超过 MAX 的形如 2^a * 5^b 的数
    for (long long a = 1; a <= MAX; a *= 2) {
        for (long long b = a; b <= MAX; b *= 5) {
            nums.insert(b);
        }
    }

    // 统计个数
    int ans = 0;
    for (int t: nums) {
        if (t > r) break; 
        ans += t >= l;
    }

    cout << ans << endl;
    return 0;
}

如果本题为多组数据,则需要加入二分查找等优化方案提高求解效率。