каков самый быстрый способ вычислить это, я видел, как некоторые люди используют матрицы, и когда я искал в Интернете, они говорили о собственных значениях и собственных векторах (не знаю об этом)... был вопрос, который сводился к рекурсивному уравнение f(n) = (2*f(n-1)) + 2 и f(1) = 1, n может быть до 10 ^ 9.... я уже пытался использовать DP, сохраняя до 1000000 значений и используя общий метод быстрого возведения в степень, все время истекло, я обычно слаб в этих вопросах по модулю, которые требуют вычисления больших значений
как рассчитать 2^n по модулю 1000000007, n = 10^9
Ответы (3)
f(n) = (2*f(n-1)) + 2 with f(1)=1
эквивалентно
(f(n)+2) = 2 * (f(n-1)+2)
= ...
= 2^(n-1) * (f(1)+2) = 3 * 2^(n-1)
так что наконец
f(n) = 3 * 2^(n-1) - 2
где затем можно применить быстрые модульные методы питания.
person
Lutz Lehmann
schedule
24.05.2014
Для немецкоязычных, интересующихся, я смутно припоминаю тему, затронутую в учебнике Algorithmische Zahlentheorie Отто Форстера.
- person Codor; 24.05.2014
Модульное возведение в степень методом квадрата и умножения:
function powerMod(b, e, m)
x := 1
while e > 0
if e%2 == 1
x, e := (x*b)%m, e-1
else b, e := (b*b)%m, e//2
return x
person
user448810
schedule
24.05.2014
это удивительное решение
- person sahasrara62; 10.06.2019
Код C для вычисления 2^n
const int mod = 1e9+7;
//Here base is assumed to be 2
int cal_pow(int x){
int res;
if (x == 0) res=1;
else if (x == 1) res=2;
else {
res = cal_pow(x/2);
if (x % 2 == 0)
res = (res * res) % mod;
else
res = (((res*res) % mod) * 2) % mod;
}
return res;
}
person
ssp4all
schedule
10.06.2019
Может быть, да, но он все еще требует некоторой модификации. правильно?
- person ssp4all; 11.06.2019
не проверял результат, но видя что он делает, вы должны удалить его на время
- person sahasrara62; 11.06.2019
Внесены необходимые изменения, и это не дает прямых результатов!
- person ssp4all; 11.06.2019
140625001
- person ypercubeᵀᴹ   schedule 24.05.2014