没有使用大整数的大功率

时间:2017-07-16 05:01:39

标签: java

我有一个问题,我必须计算数组中大数字的总和并返回结果。例如arr = [10,12,34,56]然后输出应该是 10 ^ 1 + 12 ^ 2 + 34 ^ 3 + 56 ^ 4.这里的输出可能非常大,所以我们被要求在输出上取一个10 ^ 10 + 11的模数然后返回它。我很容易在python,但在java最初我使用BigInteger,并得到了一半的测试用例,所以我想使用Long然后使用模块指数计算功率,但后来得到错误的输出准确都是负的,因为它明显超出限制。 / p>

这是我使用Long和Modular指数的代码。

static long power(long x, long y, long p)
{
    long res = 1;      // Initialize result

    x = x % p;  // Update x if it is more than or 
                // equal to p

    while (y > 0)
    {
        // If y is odd, multiply x with result
        if ((y & 1)==1)
            res = (res*x) % p;

        // y must be even now
        y = y>>1; // y = y/2
        x = (x*x) % p;  
    }
    return res;
}

static long solve(int[] a) {
    // Write your code here
    Long[] arr = new Long[a.length];

    for (int i = 0; i < a.length; i++) {
        arr[i] = setBits(new Long(a[i]));
    }
    Long Mod = new Long("10000000011");
    Long c = new Long(0);
    for (int i = 0; i < arr.length; i++) {
        c += power(arr[i], new Long(i + 1),Mod) % Mod;
    }

    return c % Mod;
}

static long setBits(Long a) {
    Long count = new Long(0);
    while (a > 0) {
        a &= (a - 1);
        count++;
    }
    return count;
}

然后我也尝试了Binary Exponentiation,但没有任何对我有用。如何在不使用大整数的情况下实现这一点,就像我在python中得到它一样容易

1 个答案:

答案 0 :(得分:0)

你已经为mod的值添加了额外的零,它应该是1000000011。 希望这能解决它