给出一个正整数数组A,牛牛想知道其中有多少子数组满足:里面所有数字的乘积等于里面所有数字的异或。 一个数组的子数组指数组中非空的一段连续数字。请用go语言写出时间复杂度较低的答案
时间: 2023-05-29 13:06:51 浏览: 325
思路:
首先,如果一个子数组的乘积等于异或,那么这个子数组中只能有0和1两种数字。因为如果有其他数字,它们的乘积肯定不等于异或。
所以,我们可以枚举子数组的左右端点,然后再遍历子数组中的数字,计算子数组的乘积和异或,如果它们相等,就说明找到了一个符合要求的子数组。
时间复杂度:$O(n^3)$
代码:
```go
func solve(A []int) int {
n := len(A)
ans := 0
for i := 0; i < n; i++ {
for j := i; j < n; j++ {
prod := 1
xor := 0
for k := i; k <= j; k++ {
prod *= A[k]
xor ^= A[k]
}
if prod == xor {
ans++
}
}
}
return ans
}
```
相关问题
给出一个正整数数组A,牛牛想知道其中有多少子数组满足 : 里面所有数字的乘积等于里面所有数字的异或。 一个数组的子数组指数组中非空的一段连续数字。给出C++代码
#include <iostream>
#include <vector>
using namespace std;
const int MAXN = 100005;
int A[MAXN], cnt[MAXN], N;
vector<int> prime;
void init() { // 筛质数
bool isPrime[MAXN];
fill(isPrime, isPrime + MAXN, true);
for (int i = 2; i < MAXN; i++) {
if (isPrime[i]) {
prime.push_back(i);
for (int j = i * 2; j < MAXN; j += i) {
isPrime[j] = false;
}
}
}
}
int main() {
init();
cin >> N;
for (int i = 0; i < N; i++) {
cin >> A[i];
}
int ans = 0, mul = 1, xorSum = 0, l = 0;
for (int r = 0; r < N; r++) {
cnt[A[r]]++;
while (cnt[A[r]] > 1) { // 有重复元素
cnt[A[l]]--;
mul /= A[l];
xorSum ^= A[l];
l++;
}
mul *= A[r];
xorSum ^= A[r];
if (mul == xorSum) { // 满足条件
ans++;
}
for (int i = 0; i < prime.size() && prime[i] * prime[i] <= A[r]; i++) {
int p = prime[i], cntP = 0;
while (A[r] % p == 0) {
A[r] /= p;
cntP++;
}
if (cntP > 0) {
ans += cnt[P - cntP];
}
}
if (A[r] > 1) { // 处理质因子
ans += cnt[A[r] - 1];
}
}
cout << ans << endl;
return 0;
}
题目描述 给出一个正整数数组A,牛牛想知道其中有多少子数组满足:里面所有数字的乘积等于里面所有数字的异或。 一个数组的子数组指数组中非空的一段连续数字。请用go语言写出答案
package main
import "fmt"
func main() {
var n int
fmt.Scan(&n)
nums := make([]int, n)
for i := 0; i < n; i++ {
fmt.Scan(&nums[i])
}
ans := 0
for i := 0; i < n; i++ {
prod := 1
xor := 0
for j := i; j < n; j++ {
prod *= nums[j]
xor ^= nums[j]
if prod == xor {
ans++
}
}
}
fmt.Println(ans)
}
阅读全文