1 条题解
-
0
因子分解: 对序列中的每个数,分解出其因子 的个数(记为 )和因子 的个数(记为 )。
范围分析: 由于每个数的因子 的个数最多为 (因为 ),因子 的个数最多为 (因为 ),因此两个数的因子 和因子 的总和分别不超过 和 。
使用二维桶数组 统计每个(x, y)组合出现的次数。
条件判断: 对于每个点 ,计算其所需的最小因子 个数和最小因子 个数
#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
- 上传者