1 条题解

  • 0
    @ 2025-8-7 20:49:00

    O((logai)2)O((loga_i)^2)

    因子分解: 对序列中的每个数,分解出其因子 22 的个数(记为 xx )和因子 55 的个数(记为 yy )。

    范围分析: 由于每个数的因子 22 的个数最多为 3030(因为 2301092^{30}≈10^9 ),因子 55 的个数最多为 1212(因为512=2441406251095^{12}=244140625≤10^9 ),因此两个数的因子 22 和因子 55 的总和分别不超过 60602424

    使用二维桶数组 f[i][j]f[i][j] 统计每个(x, y)组合出现的次数。

    条件判断: 对于每个点 (x1,y1)(x_1, y_1) ,计算其所需的最小因子 22 个数和最小因子 55 个数

    #include <bits/stdc++.h>
    #define ll long long
    using namespace std;
    int opt[35][35], n, k, x;
    // opt[a][b] 表示含有a个2,b个5的数字数量
    ll ans;
    int main() {
        cin >> n >> k;
        for (int i = 1; i <= n; i++) {
            cin >> x;
            int tot1 = 0, tot2 = 0;
            while (x % 2 == 0) // 计算一下当前数字 2 的个数
                tot1++, x /= 2;
            while (x % 5 == 0) // 计算一下当前数字 5 的个数
                tot2++, x /= 5;
            for (int a = 0; a <= 30; a++)     // 枚举i之前2的个数为a的数有多少个
                for (int b = 0; b <= 13; b++) // 枚举i之前5的个数为b的数有多少个
                    if (tot1 + a >= k && tot2 + b >= k) // 如果可以满足 k 个 0
                        ans += opt[a][b];               // 计数
            opt[tot1][tot2]++; // 含有 tot1个2和tot2个5 的数+1
        }
        cout << ans;
        return 0;
    }
    
    • 1

    信息

    ID
    501
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    递交数
    13
    已通过
    3
    上传者