音乐网站建设流程,可以做qq空间背景音乐的网站,微信 wordpress 群发,广州海珠区景点排行榜前十名题目描述
小红拿到了一个大小为n的数组#xff0c;他想知道#xff0c;有多少连续子数组满足#xff0c;该子数组所有元素的乘积是k的倍数#xff1f;
输入输出
第一行输入2个整数#xff0c;分别是数组长度n和参数k 第二行输入n个元素的数组
n有10^5级别 数组元素有1…题目描述
小红拿到了一个大小为n的数组他想知道有多少连续子数组满足该子数组所有元素的乘积是k的倍数
输入输出
第一行输入2个整数分别是数组长度n和参数k 第二行输入n个元素的数组
n有10^5级别 数组元素有10^6级别 k有10^12级别
样例
input
3 6
2 3 4output
3思路
前缀积 质因数分解 滑窗
代码
#include bits/stdc.h
using namespace std;// 质因数分解
vectorvectorint primeFactor(int n) {vectorint res;for (int i 2; i n / i; i) {while (n % i 0) {res.push_back(i);n / i;}}if (n 1) res.push_back(n);unordered_mapint, int m;for (int i 0; i res.size(); i) {m[res[i]] ;}vectorvectorint ans;for (auto it m.begin(); it ! m.end(); it) {ans.push_back({it-first, it-second});}return ans;
}int main() {int n 3, k 6;cin n k;vectorint nums(n);for (int i 0; i n; i) {cin nums[i];}auto fact primeFactor(k);// b[i][j] 表示 nums[i] 中包含 fact[j][0] 的个数vectorvectorint b(1, vectorint(fact.size(), 0));for (int i 0; i n; i) {vectorint tmp b.back();for (int j 0; j fact.size(); j) {while (nums[i] % fact[j][0] 0) {nums[i] / fact[j][0];tmp[j] 1;}}b.push_back(tmp);}// 检查子数组 [l, r] 是否满足条件auto check [](int l, int r) - bool {for (int i 0; i fact.size(); i) {if (b[r1][i] - b[l][i] fact[i][1]) {return false;}}return true;};int l 0, r 0;int ans 0;for (r 0; r n; r) {while (l r check(l, r)) {// [l, r], [l, r1], ... [r, n-1] 都满足条件ans n - r;l ;}}cout ans endl;return 0;
}参考字节跳动 秋招 2023.10.08 编程题目与题解