Ссылка на проблему: https://codeforces.com/problemset/problem/166/E
Постановка задачи:
* Вам дан тетраэдр. Обозначим его вершины буквами A, B, C и D соответственно.
В вершине D тетраэдра стоит муравей. Муравей довольно активен и не будет бездействовать. В каждый момент времени он делает шаг от одной вершины к другой по некоторому ребру тетраэдра. Муравей просто не может стоять на одном месте. Для решения проблемы много делать не нужно: ваша задача - подсчитать количество способов, которыми муравей может go из начальной вершины D к себе ровно за n шагов. Другими словами, вам предлагается узнать количество различных циклических c путей длиной n от вершины D до самой себя. Поскольку число может быть довольно большим, вы должны вывести его по модулю 1000000007 (10 ^ 9 + 7). *
Ввод: Первая строка содержит единственное целое число n (1 ≤ n ≤ 107) - требуемая длина цикла c пути.
Вывод: Вывести единственное целое число - необходимое количество путей по модулю 1000000007 (10e9 + 7).
Пример: вход n = 2, выход: 3 вход n = 4, выход: 21
Мой подход к проблеме: Я написал рекурсивный код, который принимает два входа n и представляет index, то я путешествую и исследую все возможные комбинации.
#include<iostream>
using namespace std;
#define mod 10000000
#define ll long long
ll count_moves=0;
ll count(ll n, int present)
{
if(n==0 and present==0) count_moves+=1, count_moves%=mod; //base_condition
else if(n>1){ //Generating All possible Combinations
count(n-1,(present+1)%4);
count(n-1,(present+2)%4);
count(n-1,(present+3)%4);
}
else if(n==1 and present) count(n-1,0);
}
int main()
{
ll n; cin>>n;
if(n==1) {
cout<<"0"; return;
}
count(n,0);
cout<<count_moves%mod;
}
Но проблема в том, что я получаю ошибку ограничения времени, так как сложность времени моего кода очень высока. Пожалуйста, кто-нибудь может предложить мне, как я могу оптимизировать / запоминать мой код, чтобы уменьшить его сложность?
# ** Редактировать 1: ** Некоторые люди комментируют макросы и деление, но это не проблема. Диапазон n равен 10 ^ 7, а сложность моего кода экспоненциальна, поэтому я действительно сомневаюсь, как уменьшить его до линейного времени. i, e O (n).