【问题标题】:How to find number of subarrays whose product is divisible by 4 in linear time如何在线性时间内找到乘积可被 4 整除的子数组的数量
【发布时间】:2020-07-17 06:13:08
【问题描述】:

我试过了,但我无法正确实现它。 这是我写的代码是错误的,因为我没有计算一些子数组。 是否可以编写一个运行的算法 O(n)

    int even=0 , count =0 ;
    for( int i=0 ; i<n ; ++i ) {
        if(arr[i]%4==0) {
            count = count + n - i ;
            if(even==1) { 
               count = count + n - i ; 
               --even; 
            }
        }   
        else if(a[i]%2==0) {
            ++even;
            if(even==2) {
                count = count + n - i ; 
                --even; 
            }
        }
    }

示例 I/O - 如果 arr[] = {1,4,9} 那么答案应该是 4 因为 {1,4} , {1,4,9} , {4,9} , {4} 有他们的产品能被 4 整除。

【问题讨论】:

  • 您能否为这个问题提供一些示例输入/输出?
  • @ManishSundriyal 如果 a[3] = {1,4,9}。答案应该是 3,因为 {1,4} 、 {4} 、 {4,9} 的产品可以被 4 整除。编辑 - {1,4,9} 也是有效的
  • @newbie 但{1,4,9} 本身不也算作子数组吗?它的乘积也能被 4 整除。
  • @newbie 什么是子数组?例如给定 {1,4,9} 是 {1,9} 一个子数组?还是子数组元素必须在父数组中连续?换句话说,子数组是子集还是子序列?
  • @selbie 是的,抱歉我忘记了。

标签: c++ algorithm sub-array


【解决方案1】:

我不确定这是否可以以线性时间复杂度解决。 但是,下面的链接有一些解决这个问题的方法。 希望对你有帮助。

https://www.geeksforgeeks.org/count-sub-arrays-whose-product-is-divisible-by-k/

【讨论】:

  • 该链接只会被试图安装恶意软件的恶意嵌入广告重定向。
  • @selbie 是的,它有广告(所以?)。尝试安装恶意软件?没门。这是最受欢迎的算法和数据结构网站之一。
  • 前 3 次将我重定向到恶意软件页面。第四次更好。
  • 这很奇怪,但我很确定它不是来自那个网站。
  • 来自“如何回答”:“为链接提供上下文 鼓励链接到外部资源,但请在链接周围添加上下文,以便您的其他用户了解它是什么以及它为什么存在。始终引用重要链接中最相关的部分,以防目标站点无法访问或永久离线。”
【解决方案2】:

请不要回答问题

它与竞赛中的一个持续问题有关

希望大家理解。

这是比赛和问题的链接 https://www.codechef.com/APRIL20B/problems/SQRDSUB

请遵守它,以感谢那些自己解决它的人

编辑:既然比赛已经结束,我将在 2020 年 4 月 14 日提供答案 注意: 代码是用python3编写的

def ALL_SUBS_PRO_DIV_BY_4(arr, n):
    even_ind = [i for i,it in enumerate(arr) if it%2==0]
    TOTAL_COUNT = 0

    last = -1
    while even_ind:
        ind = even_ind.pop(0)
        if arr[ind]%4==0:
            TOTAL_COUNT += (ind-last) * (n-ind)
            last = ind
        else:
            if even_ind:
                ind2 = even_ind[0]
                TOTAL_COUNT += (ind - last)*(n-ind2)
            else:
                return TOTAL_COUNT
            last = ind
    return ans            

我知道你们很多人可能需要解释,但我想你可以简单地运行代码并打印值来看看发生了什么

无论如何,如果有人需要解释,请在下面发表评论。我可能会上传一个解释算法的谷歌文档

【讨论】:

    【解决方案3】:

    这是 codechef 在线,目前正在进行 4 月挑战相关查询。根据在线竞赛规则 abd 规定。请勿剧透... 4月13日下午3:00后可以查看。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-08
      • 2011-03-26
      • 1970-01-01
      • 2013-05-12
      • 1970-01-01
      • 2020-07-20
      相关资源
      最近更新 更多