蓝桥杯 第3220题 小蓝学位运算 C++ Java Python

题目

思路和解题方法

复杂度:

时间复杂度:

空间复杂度:

c++ 代码

Java 版本(仅供参考)

Python 版本(仅供参考)


题目

思路和解题方法

计算给定数组中子数组异或结果不为零的子数组个数。它通过计算数组的前缀异或和,并使用两层循环来遍历所有可能的子数组,计算其异或和,如果为零则输出零。否则,累乘所有不为零的异或和,最终输出结果。

复杂度:

  • 时间复杂度:

两层循环导致时间复杂度为 O(n^2)。

  • 空间复杂度:

  程序的空间复杂度取决于数组大小和其他常量,因此为 O(n)。

c++ 代码

#include <iostream>
using namespace std;
using ll = long long;
const ll p = 1e9+7;
const ll N = 1e6+4;
ll a[N], pre[N];

int main() {
    int n;
    cin >> n;
    for(int i = 1; i <= n; i++)
        cin >> a[i];
    
    // 计算前缀异或和
    for(int i = 1; i <= n; i++)
        pre[i] = pre[i-1] ^ a[i];

    ll ans = 1;
    // 遍历所有可能的子数组
    for(int i = 1; i <= n; i++) {
        for(int j = i; j <= n; j++) {
            // 计算子数组的异或和
            ll t = pre[i-1] ^ pre[j];
            // 如果异或和为零,则输出零
            if (!t) {
                cout << 0;
                return 0;
            }
            ans = ans * t % p;
        }
    }
    cout << ans << '\n';

    return 0;
}

Java 版本(仅供参考)

import java.util.*;

public class Main {
    static final long p = 1000000007L;
    static final int N = 1000004;

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        long[] a = new long[N];
        long[] pre = new long[N];

        for (int i = 1; i <= n; i++)
            a[i] = scanner.nextLong();

        for (int i = 1; i <= n; i++)
            pre[i] = pre[i - 1] ^ a[i];

        long ans = 1;
        for (int i = 1; i <= n; i++) {
            for (int j = i; j <= n; j++) {
                long t = pre[i - 1] ^ pre[j];
                if (t == 0) {
                    System.out.println(0);
                    return;
                }
                ans = ans * t % p;
            }
        }
        System.out.println(ans);
    }
}

Python 版本(仅供参考)

p = 1000000007
N = 1000004

n = int(input())
a = list(map(int, input().split()))
pre = [0] * N

for i in range(1, n + 1):
    pre[i] = pre[i - 1] ^ a[i - 1]

ans = 1
for i in range(1, n + 1):
    for j in range(i, n + 1):
        t = pre[i - 1] ^ pre[j]
        if t == 0:
            print(0)
            exit()
        ans = (ans * t) % p

print(ans)

觉得有用的话可以点点赞,支持一下。

如果愿意的话关注一下。会对你有更多的帮助。

每天都会不定时更新哦  >人<  。

posted @   lenyan~  阅读(22)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示