📌  相关文章
📜  其乘积为复合数的所有子序列的计数(1)

📅  最后修改于: 2023-12-03 15:07:05.751000             🧑  作者: Mango

计算复合数子序列的个数

问题描述

给定一个整数序列,计算其乘积为复合数的所有子序列的个数。

解法介绍

首先,我们需要知道什么是复合数。一个大于 1 的正整数如果它不是质数,则称它为复合数。

我们可以使用动态规划的思路来解决这个问题。对于序列中的每个位置 i,我们记录两个值:

  • pos[i] 表示序列中前 i 个数中以第 i 个数结尾的复合数子序列的个数。
  • neg[i] 表示序列中前 i 个数中以第 i 个数结尾的负复合数(即负数的乘积为复合数)子序列的个数。

对于 pos[i] 的计算,我们可以依次枚举前 i-1 个数中的每一个位置 j,如果 nums[i] 是正数,pos[i] 可以由 pos[j] 乘上 nums[i] 得到;如果 nums[i] 是负数,则 pos[i] 可以由 neg[j] 乘上 nums[i] 得到。

对于 neg[i] 的计算,同理可以依次枚举前 i-1 个数中的每一个位置 j,如果 nums[i] 是正数,neg[i] 可以由 neg[j] 乘上 nums[i] 得到;如果 nums[i] 是负数,则 neg[i] 可以由 pos[j] 乘上 nums[i] 得到。

最终,答案就是 pos[n](其中 n 是序列的长度)。

以下是 Python 代码实现:

def composite_subsequence_count(nums):
    n = len(nums)
    pos = [0] * (n + 1)
    neg = [0] * (n + 1)
    ans = 0
    
    for i in range(1, n+1):
        if nums[i-1] == -1:
            pos[i] = neg[i-1]
            neg[i] = pos[i-1]
        elif nums[i-1] > 0:
            pos[i] = pos[i-1] + 1
            neg[i] = neg[i-1] if neg[i-1] else 0
        else:
            pos[i] = neg[i-1] if neg[i-1] else 0
            neg[i] = pos[i-1] + 1
        
        ans += pos[i]
    
    return ans
复杂度分析

时间复杂度:$O(n)$,其中 n 是序列的长度。

空间复杂度:$O(n)$。