求C++代码
时间: 2023-07-10 21:11:47 浏览: 105
C++代码
以下是使用哈希表的 C++ 代码实现:
```cpp
#include <iostream>
#include <unordered_map>
#include <vector>
using namespace std;
typedef long long ll;
const int MAXN = 2e5 + 5;
const int MAXK = 1e9 + 5;
int n, k;
ll a[MAXN], p2[MAXN], p5[MAXN];
unordered_map<int, int> cnt;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> k;
for (int i = 1; i <= n; i++) {
cin >> a[i];
while (a[i] % 2 == 0) {
p2[i]++;
a[i] /= 2;
}
while (a[i] % 5 == 0) {
p5[i]++;
a[i] /= 5;
}
}
ll ans = 0;
cnt[0]++;
for (int i = 1; i <= n; i++) {
int x = p2[i] - p2[i - 1];
int y = p5[i] - p5[i - 1];
int key = x * MAXK + y - k;
ans += cnt[key];
cnt[x * MAXK + y]++;
}
cout << ans << endl;
return 0;
}
```
其中,p2[i] 和 p5[i] 分别表示前 i 个数的因子中 2 和 5 的个数,cnt 表示哈希表,key 表示当前连续子段对应的二元组之差。注意,在计算 key 时,我们需要将 2 的因子个数乘以 MAXK,从而使得 2 和 5 的因子个数可以作为一个整体来处理。同时,为了避免 key 取负数,我们将其减去 k。最后,需要注意初始时 cnt[0] 的值应该为 1,因为当前连续子段为空时,其对应的二元组之差为 (0, 0)。
阅读全文