will try to convert the term:
T(1) = 2 ^ k
T(2) = 2 * 2 ^ k - 1
T(3) = 2 * 2 * 2 ^ k - 2 * 1 - 1 = 2 ^ 2 * 2 ^ k - 2 ^ 1 - 1
T(4) = 2 * 2 * 2 * 2 ^ k - 2 * 2 * 1 - 2 = 2 ^ 3 * 2 ^ k - 2 ^ 2 - 2 ^ 1
T(5) = 2 * 2 * 2 * 2 * 2 ^ k - 2 * 2 * 2 * 1 - 2 * 2 - 4 = 2 ^ 4 * 2 ^ k - 2 ^ 3 - 2 ^ 2 - 2 ^ 2
T(6) = 2 * 2 * 2 * 2 * 2 * 2 ^ k - 2 * 2 * 2 * 2 * 1 - 2 * 2 * 2 - 2 * 4 - 8 = 2 ^ 5 * 2 ^ k - 2 ^ 4 - 2 ^ 3 - 2 ^ 3 - 2 ^ 3
as you can see, we can break it down into 2 terms: first:
T(n) = 2 ^ (n-1) * 2 ^ k + ... = 2 ^ (k + n - 1) + ...
second:
T(n) = ... + -2^(n-2) - (n - 2) * 2^(n-3)
:
T(n) = 2^(k + n - 1) - 2^(n-2) - (n - 2) * 2^(n-3)
modulo :
T(n) = 2^(n - 3) * (2^(k + 2) - 2^(1) - (n - 2)) = 2^(n - 3) * (2^(k + 2) - n)
modulo:
T(n) modulo 40009 = ((2^(n - 3) modulo 40009) * (2^(k + 2) - n) modulo 40009) modulo 40009
BigInteger:
static long calc(int n, int k, int m) {
BigInteger left = new BigInteger("2");
BigInteger nBig = new BigInteger(String.valueOf(n - 3));
BigInteger mod = new BigInteger(String.valueOf(m));
left = left.modPow(nBig, mod);
BigInteger right = new BigInteger("2");
right = right.pow(k + 2);
right = right.subtract(new BigInteger(String.valueOf(n)));
right = right.mod(mod);
left = left.multiply(right);
left = left.mod(mod);
return left.longValue();
}
EDIT: