Я пытаюсь рассчитать количество способов состав числа с использованием номеров 1 и 2.
Это можно найти с помощью ряда Фибоначчи, где F(1)=1
а также F(2)=2
а также
F(n)=F(n-1)+F(n-2)
Так как F (n) может быть очень большим, мне просто нужно F(n)%1000000007
. Для ускорения процесса я использую возведение в степень Фибоначчи. Я написал два кода для одной и той же задачи (оба почти одинаковы). Но один из них не подходит для больших чисел. Я не могу понять, какой из них правильный?
CODE 1
CODE 2
Хотя у меня есть чувство, во-первых, нужно быть правильным. Я не могу понять, что произойдет, когда есть случай, когда мы умножаем, скажем, a
а также b
и значение a
уже превысил верхний предел a
и когда мы умножаем это на b
то насколько я могу быть уверен a*b
верно. Насколько мне известно, если a
значение превышает его пределы типа данных, затем значение начинается снова с самого низкого значения, как в примере ниже.
#include<iostream>
#include<limits.h>
using namespace std;
int main()
{
cout<<UINT_MAX<<endl;
cout<<UINT_MAX+2;
}
Output
4294967295
1
«Переполнение» (вы на самом деле не называете это для беззнаковых, они оборачиваются) n-битных типов без знака сохранит значения только по модулю 2 ^ n, а не по модулю произвольного модуля (как они могут? Попробуйте воспроизвести шаги с помощью ручка и бумага). Поэтому вы должны убедиться, что ни одна операция не выходит за пределы вашего типа, чтобы поддерживать правильные результаты мод 100000007.
Других решений пока нет …