Может ли кто - нибудь уменьшить сложность моего кода? Проблема е на Codeforces round113 див.2
Ссылка на проблему: https://codeforces.com/problemset/problem/166/E[^]
постановка задачи:
*Вам дан тетраэдр. Обозначим его вершины буквами A, B, C и D соответственно.
Муравей стоит в Вершине D тетраэдра. Муравей довольно активен, и он не будет сидеть сложа руки. В каждый момент времени он делает шаг от одной вершины к другой вдоль некоторого края тетраэдра. Муравей просто не может стоять на одном месте. Вам не нужно много делать, чтобы решить эту проблему: ваша задача состоит в том, чтобы подсчитать количество способов, которыми муравей может пройти от начальной вершины D к себе ровно за n шагов. Другими словами, вас просят узнать количество различных циклических путей длиной n от вершины D до самой себя. Поскольку число может быть довольно большим, вы должны вывести его по модулю 1000000007 (10e9 + 7).*
Ввод: Первая строка содержит единственное целое число n (1 ≤ n ≤ 107) — требуемую длину циклического пути.
Выход: Выведите единственное целое число — необходимое количество способов по модулю 1000000007 (10e9 + 7).
Пример: Вход n=2 , Выход: 3 Вход n=4, Выход: 21
Что я уже пробовал:
Мой подход к проблеме: Я написал рекурсивный код, который принимает два входных n и настоящий индекс, а затем путешествую и исследую все возможные комбинации.
#include<iostream> using namespace std; #define ll long long #define mod 10000000 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; }
Но проблема в том, что я получаю ошибку ограничения по времени, так как временная сложность моего кода очень высока. Пожалуйста, кто-нибудь может подсказать мне, как я могу оптимизировать/запомнить свой код, чтобы уменьшить его сложность?