如何减少此代码的复杂性

时间:2019-03-31 09:42:02

标签: c++ optimization

1<T<10 (where T is number of test cases)
1<N<1000

我们必须优化此代码。

我尝试存储从N1小于N^2的所有数字的因数。但这仍然给TLE

int count = 0;
for (int i = 1; i <= N; i++)
{
    for (int j = 1; j <= N; j++)
    {
        for (int k = 1; k <= N; k++)
        {
            if ((i * j) % k == 0)
             count++;
        }
    }
}
return count;

所以我想它可能应该在O(N ^ 2)中运行

2 个答案:

答案 0 :(得分:0)

减少运行时间的一种简单方法是使用最大公约数(此处使用c ++ 17),如下所示:

#include <numeric>
int main(){
    int N = 1000;
    int count = 0;
    for (int k = 1; k <= N; ++k){
        for (int j = 1; j <= N; ++j){
            int gcd = std::gcd(j,k);
            count += N/(k/gcd);
        }
    }
    return count;
}

这具有O(N ^ 2 log(N))的运行时间。 我相信通过k分解可以进一步降低复杂度,但是解决方案可能会变得更加复杂。

编辑:在O(1)中可能有一个简单的数学公式可以解决这个问题。这需要一些思考。

答案 1 :(得分:-1)

离线编写代码并运行它。当离线运行时,写入文件。

fprintf(f,"a[%d]=%d;",n,function(n));

其中a是1001个元素的向量。 使用生成的代码。

int function(int N) {
int count = 0;
for (int i = 1; i <= N; i++)
{
    for (int j = 1; j <= N; j++)
    {
        for (int k = 1; k <= N; k++)
        {
            if ((i * j) % k == 0)
             count++;
        }
    }
}
return count;
}

int main() {
FILE* f = fopen("data.cpp","w");
for(int i=1;i<=1000;++i) {
fprintf(f,"a[%d]=%d;",n,function(n));
if(i%10==0) fprintf(f,"\n");
}
fclose(f);
return 0;
}

您可以在PC上和data.cpp中运行此代码,您将获得可用于实际解决方案的新的部分源代码。

int main() {
int a[1001];
// <- generated code here

// here you will need to use a as a cached value instead of computing

return 0;
}