当前位置: 代码迷 >> J2SE >> ,编程挑战代码运行效率有关问题
  详细解决方案

,编程挑战代码运行效率有关问题

热度:90   发布时间:2016-04-23 20:09:44.0
求助,编程挑战代码运行效率问题
题目详情
给定a和n,计算a+aa+aaa+aaaa+...+a...a(n个a) 的和。
输入描述:
测试数据有多组,以文件结尾。每行输入a,n(1<=a,n<=1000000)。
输出描述:
由于结果可能比较大,所以请输出答案mod 1000000007。


import java.math.BigInteger;
import java.util.Scanner;

public class sum2 {

    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);
        int a,n;
        BigInteger e = new BigInteger("0");
        BigInteger x = new BigInteger("0");
        BigInteger d = new BigInteger("10");
        BigInteger mod = new BigInteger("1000000007");
        BigInteger m ;
        while (in.hasNext())
        {
            a = in.nextInt();
            n = in.nextInt();
            m = BigInteger.valueOf(n);
            for (int i = 0; i < n; i++) {
                e = e.add(d.pow(i).multiply(m.subtract(BigInteger.valueOf(i))));
            }
            System.out.println((BigInteger.valueOf(a)).multiply(e).mod(mod));
            e = x;
        }
        in.close();

    }
}  



这是我的代码,最后的结果是效率低下,未通过,哪位大神能指点指点么?有更好的思路么?
谢谢!
------解决思路----------------------
你这个写法计算一组测试用例的时间复杂度是O(n^2),对于10^6的规模效率肯定是太低太低了。
可以这样
              1
           1 1
          111
        1111
。。。。
11111111
从最后一列开始,每一列的和递减1,可以一列一列的加,加完一列取一次余,避免溢出。这样的话时间复杂度是O(n),运行时间在几秒以内。其实这是一道典型的模拟题,就是用数组模拟加法运算。
------解决思路----------------------
递归。。。 。。。。。。。      
------解决思路----------------------
(a+b)%c=(a%c+b%c)%c;
------解决思路----------------------
(a*b)%c=(a%c*b%c)%c;

n<=1000000: 100万个a排在一起,醉了
------解决思路----------------------
这玩应不是这么算的 暴力能解决还叫编程比赛么 肯定有玄机 

善用百度啊少年http://blog.csdn.net/fool_ran/article/details/41127633
  相关解决方案