计算所有乘积应乘以四或为奇数的所有可能子阵列的乘积数

时间:2020-04-10 11:11:42

标签: c++ c++11

我尝试计算所有可能的子数组生成的乘以4的奇数或可乘数的乘积的数量,但是我的实现得到O(n ^ 2)....我需要O(n)时间。我也试图得到一些模式,但找不到 这是我的代码

#include<bits/stdc++.h>
#define lli long long int
using namespace std;
int main()
{
    lli testcases,x,M=1000000007;
    cin>>testcases;
    for(x=0;x<testcases;x++){
        lli n,i,j,temp,count1=0;
        cin>>n;
        vector<lli>v;
        for(i=0;i<n;i++){
            cin>>temp;
            v.push_back(temp);
        }
        for(i=0;i<n-1;i++){
            if(v[i]%2!=0 || v[i]%4==0){
                ++count1;
            }
            temp=v[i];
            for(j=i+1;j<v.size();j++){
                temp*=v[j];
                if(temp%2!=0 || temp%4==0){
                    ++count1;
                }
            }
        }
        if(v[n-1]%2!=0 || v[n-1]%4==0){
            ++count1;
        }
        cout<<count1<<"\n";
        count1=0;
    }
    return 0;
}

提前谢谢!

2 个答案:

答案 0 :(得分:2)

问题是要求乘积为奇数(零因数为2)或乘以四(至少为两个因数为2)的子数组的数量。 我们也可以将其反转:取子数组(2 ** N)的个数,然后减去正好为 为2的子数组的个数。

因此,首先对数组进行预处理,并用因子2替换每个数字(即7变为0,8变为3,依此类推)。 然后的问题是“有多少个子数组合计为一个精确的子数组”,这具有已知的解决方案。

答案 1 :(得分:0)

该问题直接与Codechef的(四月挑战)联系在一起。我认为在比赛结束(2020年3:00 pm,13/04/2020)之前直接在这里提问不是一个好主意。 请遵守Codechef的法规。如果您不相信我的话,可以在此链接中查看。
https://www.codechef.com/APRIL20B/problems/SQRDSUB或直接访问Codechef四月挑战赛(平方序列)。

相关问题