Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 最长连续子阵的长度,使得子阵的LCM等于其中元素的乘积_C++ - Fatal编程技术网

C++ 最长连续子阵的长度,使得子阵的LCM等于其中元素的乘积

C++ 最长连续子阵的长度,使得子阵的LCM等于其中元素的乘积,c++,C++,在C++中,我很难解决这个问题。我最初的想法是找到所有元素中从2到10^6的最低素因子,因为它是给定的约束。然后,我使用了两个指针和一个集合。我的算法如下: LPF = Array // LPF[i] = lowest prime factor of i precalculated Arr = Input array // Array has elements ranging 1 to 10^6 N = Size(Arr) // N is at most 10^5 S = set i = 0

在C++中,我很难解决这个问题。我最初的想法是找到所有元素中从2到10^6的最低素因子,因为它是给定的约束。然后,我使用了两个指针和一个集合。我的算法如下:

LPF = Array // LPF[i] = lowest prime factor of i precalculated

Arr = Input array // Array has elements ranging 1 to 10^6
N = Size(Arr) // N is at most 10^5

S = set
i = 0
result = 0

FOR j=0 to N-1:
    IF Arr[j] != 1 THEN: // Since 1 won't affect the result and we can always include it
        WHILE S contains LPF[Arr[j]]:
            REMOVE LPF[Arr[i]] FROM S
            i = i + 1
        ADD LPF[Arr[j]] TO S
    result = MAX(result, j-i+1)
样本测试用例通过。但是,当我提交时,它给出了错误的答案。我只是不确定我的方法是否正确

我的实际代码:

#include<bits/stdc++.h>
using namespace std;

#pragma GCC optimize "trapv"
#define mp make_pair
#define pb push_back
#define ll long long
#define tc int testCases; cin>>testCases; while(testCases--)
#define all(v) v.begin(), v.end()

const ll P = 1000000007;
const ll SZ = 3e6;

vector<int> lpf(SZ);
void sieve() {
    lpf[1] = 1;
    for(int i=2; i<SZ; i++)
        lpf[i] = i;

    for(int i=2; i<SZ; i+=2)
        lpf[i] = 2;

    for(int i=3; (ll)i*i < SZ; i+=2) {
        if(lpf[i] == i) {
            int j = i * 2;
            while(j < SZ) {
                if(lpf[j] != 2) {
                    lpf[j] = i;
                }
                j += i;
            }
        }
    }
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    sieve();
    tc {
        int n;
        cin>>n;
        vector<int> arr(n);

        for(int i=0; i<n; i++) cin>>arr[i];

        bool lset[SZ];
        for(int i=0; i<SZ; i++) lset[i] = false;

        int i = 0;
        int res = 0;
        for(int j=0; j<n; j++) {
            if(arr[j] != 1) {
                while(lset[lpf[arr[j]]]) {
                    lset[lpf[arr[i]]] = false;
                    i++;
                }
                lset[lpf[arr[j]]] = true;
            }
            res = max(res, j-i+1);
        }

        if(res == 1) {
            cout<<-1<<"\n";
        } else cout<<res<<"\n";
    }

    return 0;
}
代码对于示例运行良好,但是对于一些隐藏的测试用例失败,不幸的是,CodeChef没有显示,并在提交时给出WA


谢谢大家!A=[10,15],您的代码将错误地输出2,因为它认为LCM(10,15)=10*15,即使它们共享因子5。剩下的两个指针的方法还可以,但在每一步中,你都应该删除/添加集合S中的所有素数因子,而不仅仅是最低的一个。

你能牺牲自定义编码并使用像LAPACK这样的库吗?我想在某些比赛中,库是不可用的。我仍在学习竞争性编程,最好还是坚持执行方面。但对于这个问题,我想确定我的方法是否正确,如果正确,是否存在任何边缘情况和所有情况?我需要主代码,我可以直接在Eclipse中运行,我绑定执行此操作,我得到
分段错误(内核转储)
,但它在CodeChef编辑器中运行,没有任何运行时错误。它给出了错误的答案,并对提交做出了裁决(好的,让我试试ideone
Input:
3
2
7 2
4
2 2 3 4
3
2 2 4

Output:
2
2
-1