Java Sigma方程求解sigma(i = 1到k)(( - 1)^ i + 1)(i)(i + 1)长值的超时值

时间:2017-08-19 08:28:40

标签: java induction

  

在计算sigma表示法的值时出现timedout错误   sigma(i = 1到k)(( - 1)^ i + 1)(i)(i + 1)非常长的值示例:10 ^ 8   任何人都可以指导我做错的地方

import java.io.*;
import java.util.*;


public class TestClass {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        PrintWriter wr = new PrintWriter(System.out);
        int T = Integer.parseInt(br.readLine().trim());
        for(int t_i=0; t_i<T; t_i++)
        {
            int params1 = Integer.parseInt(br.readLine().trim());

            long out_ = maxValueX(params1);
            System.out.println(out_);
            System.out.println("");
         }

         wr.close();
         br.close();
    }
    static long maxValueX(long params1){
        long sum=0;
       for(long i=1;i<=params1;i++){
           sum=(long)Math.pow(-1,i+1)*i*(i+1)+sum;
       }
       return sum;

    }
}

1 个答案:

答案 0 :(得分:0)

诀窍是简化sigma表达式。如果params1是偶数:

1*2 - 2*3 + 3*4 - 4*5 + 5*6 - 6*7 + ... =
(1*2 - 2*3) + (3*4 - 4*5) + (5*6 - 6*7) + ... =
2*(1-3) + 4*(3-5) + 6*(5-7) + ... =
-2*2 + -2*4 + -2*6 + ... =
-2*2*(1 + 2 + 3 + ...)

现在,带括号的术语有一个封闭形式的公式,因此您甚至不需要迭代计算它:https://en.wikipedia.org/wiki/1_%2B_2_%2B_3_%2B_4_%2B_%E2%8B%AF

这种方法也适用于奇数params1,除了在最后需要考虑的额外术语。

通过一些进一步的代数操作(留给读者的练习),可以得出一个适用于奇数和偶数参数的单个公式。在伪代码中(恰好是有效的Python):

def linear_time(n):
  return sum((-1)**(i+1)*i*(i+1) for i in range(1, n+1))

def constant_time(n):
  return (-1)**n * (-n*n//2 - n)

for n in (100, 101, 120, 100000, 1297981):
  print linear_time(n), constant_time(n)

(取幂只是计算符号的一个懒惰的快捷方式;我们实际上并不需要为此计算指数。)