Вам не нужно вычислить ММ. Вот почему:
PP[i] = 5*MM[i-1] = 5*(RR[i-2] + 2*PP[i-2])
RR[i] = RR[i-1] + 3*PP[i-1] = (RR[i-2] + 3*PP[i-2]) + 3*PP[i-1]
См.? Вам не нужно вычислять ММ на каждом шаге. Это должен быть алгоритм:
public class RecurrenceMachine {
private static final int max = 1000000006;
public String calculate(int k, int j) {
long n = k * j;
if (n < 1)
return "error";
long RRi2 = 3;
long PPi2 = 0;
long RRi1 = 3 + 3 * PPi2;
long PPi1 = 5 * 1;
if (n == 1)
return RRi1 + "##" + (RRi2 + 2 * PPi2) + "##" + PPi1;
Long PPi = (long) 0, RRi = (long) 0, temp;
int i;
for (i = 2; i <= n; i++) {
temp = RRi2 + 2 * PPi2;
PPi = 5 * temp;
if (PPi >= max)
PPi %= max;
RRi = temp + PPi2 + 3 * PPi1;
if (RRi >= max)
RRi %= max;
RRi2 = RRi1;
PPi2 = PPi1;
RRi1 = RRi;
PPi1 = PPi;
}
return RRi + "##" + (RRi2 + 2 * PPi2) % max + "##" + PPi1;
}
}
Я пробовал только с небольшими значениями и, похоже, сработал.
@ DavidPostill Why OT? Здесь важны оптимизация и производительность. – maaartinus
Я думаю, это больше подходит для математики, так как существует закрытое решение формы. Другая возможность: вы можете ускорить программу дважды, выведя формулу для двух шагов. И это можно повторить ... – maaartinus
@DavidPostill Другие отправили бы его в CR. Это все BS, если вы спросите меня. – maaartinus