Java:2D阵列的总和,其中M [i] [j] =(int)i / j

时间:2017-04-26 05:37:17

标签: java arrays matrix sum 2d

T - 测试用例数| 1< = T< = 10并且n个元素数| 1·; = N< = 1000000

例如

if (T >= 1 && T <= 10) {
    for (int i = 0; i < T; i++) {
                int n = sc.nextInt();
                if (n > 0 && n <= 1000000) {
                    array = new int[n][n];
                    System.out.print("\n" + sumOfArray(array, n));
                }
             }
          }

需要找到M [i] [j]之和,其中M [i] [j] =(int)i / j;

我已经编写了代码,但是对于n> 10000,我开始得到OOM,(显而易见的原因)。

如果有人可以帮助我,那就太棒了。需要一种全新的方法来解决问题。

EG。

Input   Output
2       
2       4
4       17

1 个答案:

答案 0 :(得分:2)

这里很明显,您不需要将值存储在矩阵中,因为不可能有足够的空间(Array[10000][10000])可供分配。所以你需要以mathematical的方式思考。

考虑4x4矩阵,并在i,j的术语中表示每个元素。

1,1 1,2 1,3 1,4
2,1 2,2 2,3 2,4
3,1 3,2 3,3 3,4
4,1 4,2 4,3 4,4

现在我们可以在这里表示存储在每个元素中的内容。

1/1 1/2 1/3 1/4   (In Integers)     1 0 0 0
2/1 2/2 2/3 2/4   ============>     2 1 0 0
3/1 3/2 3/3 3/4                     3 1 1 0
4/1 4/2 4/3 4/4                     4 2 1 1

通过将此矩阵分成列并解决每个columns来解决此矩阵。 对于第一列系列,将为1+2+3+4。然后,对于列号two(2),系列将为0+1+1+2

请注意,对于ithfirst i-1值为零,然后i values在列中相同。然后value增加。同样,i值也是一样的。再次增加1等等。

因此ith列值increased jth j%i==0元素1-D

因此,您可以在O(n logn)数组中实现此逻辑,对于每个测试用例,此方法的复杂性将为import java.util.Scanner; public class Main { public static void main(String args[]) { Scanner sc=new Scanner(System.in); int testcases=sc.nextInt(); while(testcases-- >0) { int n=sc.nextInt(); long array[]=new long[n+1]; //Take long array to avoid overflow for(int i=1;i<=n;i++) { for(int j=i;j<=n;j+=i) { array[j]++; //This will store that which elements get increased //from zero how many times } } //Now we can do summation of all elements of array but we need to do prefix sum here long sum=0; for(int i=1;i<=n;i++) { array[i]+=array[i-1]; sum+=array[i]; } System.out.println(sum); } } }

代码:

{{1}}