【发布时间】:2016-12-12 05:39:21
【问题描述】:
这是之前 HackerEarth Challenge 的一个问题 -
Roy 有一个大小为 NxN 的矩阵。行和列从 1 到 N 编号。 第 i 行的第 j 列包含整数除法 i/j。
换句话说,Matrix[i][j] = int(i/j) 其中 1 ≤ i, j ≤ N。
Your task is to find sum of this matrix i.e.
sum = 0
for i=1 to N-1
for j=1 to N-1
sum += Matrix[i][j]
Constraints:
1 ≤ T ≤ 10
1 ≤ N ≤ 1000000
这是我对这个问题的解决方案
#include <cstdio>
#include <cassert>
using namespace std;
#define MAXT 10
#define MAXN 1000000
long long solve(long long N){
long long ans = 0;
for(int i=1;i<N-1;i++)
{
for(int j=1; j<N-1 ; j++)
{
int temp = N*i/j;
ans = ans + temp;
}
}
return ans;
}
int main(){
int T, N;
scanf("%d", &T);
assert(T>0 and T<=MAXT);
while(T--){
scanf("%d", &N);
assert(N>0 and N<=MAXN);
printf("%lld\n", solve((long long)N));
}
return 0;
}
但是这个程序的输出不正确。
所以请告诉我我是否在这里正确地取得了成就。 如果是的话,我还能做些什么来优化这段代码。感谢您的帮助。
【问题讨论】:
-
不应该
int temp = N*i/j;是int temp = i/j;? -
即使你的答案是正确的,你的代码也有
O(n^2)的复杂性。对于这些在线法官网站来说,这几乎总是不合格的。 -
感谢@PaulMcKenzie 的建议。你能建议我如何减少/通过哪种方法来减少这个程序的复杂性。
-
@user216112,对于初学者,
i/j在j > i时为零。因此,内部循环可以是for (j = 1; j <= i; ++j )。 -
进一步优化:有
N-1次i/j等于1。因此,您可以使用for ( j = 1; j < i; ++j )并将N - 1添加到答案中。