問題の解決策を最適化するために、行列のべき乗法に関する優れたチュートリアルを説明または提案してください: バイトランドの万里の長城
私がアップロードしたソリューションは、この基礎となる方程式を使用した動的計画法に基づいています: [ f(n) = f(n-1) + 4*f(n-2) + 2*f(n-3) ] しかし、ソリューションは与えられていますme 制限時間超過エラー。
これは私が構築したコードです:
#include<iostream>
#define num 1000000007
using namespace std;
int main(){
int t;
cin>>t;
while(t--){
int n;
cin>>n;
if(n<=3){
switch(n){
case 1:
cout<<1<<endl;
break;
case 2:
cout<<5<<endl;
break;
case 3:
cout<<11<<endl;
break;
}
}
else{
int a=1 , b=5 , c=11 ;
int next;
for(int i=4;i<=n;i++){
next = (c + 4*b + 2*a)%num ;
a = b;
b = c;
c = next;
}
cout<<next<<endl;
}
}
return 0;
}
解の実行時間を最適化する行列累乗法を提案してください。