C++マトリックス高速べき乗

2102 ワード

これを学ぶ前に行列を長い間習ったが、まだよく分からない.その後,解斐波那契数列は四角行列だけでよいようで,四角行列の乗算を学んだ.
考え方:まず、私たちが急速にべき乗すると仮定します.では、マトリクスの高速べき乗をどのように書きますか?私たちが書いた高速べき乗は実際には、10進数の高速べき乗10進数の単位が1であることを明確にする必要があります.行列の単位が単位行列であれば、10進数の単位「1」を「単位行列」に変えるだけで行列の高速べき乗を書くことができるのではないでしょうか.答えはそうです.ただし、詳細に注意してください.10進数とマトリクスの乗算規則が異なるため、マトリクスの乗算には追加の方法を書く必要があります.
コードを付けましょう(ACなし)
#include
#include
#define ll long long
#define mod 1000000007
using namespace std;
struct Mat{
	ll m[101][101];
};
Mat initMat(int n);
Mat Mul(Mat a,Mat b,int n);
Mat poww(Mat a,ll b);
Mat a,e;//a:   e:     
int n;//     (  n   ) 
int main(){
	Mat a;
	int k;//k Mat    
	cin>>n>>k;//input         
	for(int i=0;i>a.m[i][j];
		}
	}
	
	//   e
	for(int i=0;i

コードは少し長いですが、実際には基本マトリクス+高速べき乗であり、高速べき乗の計算中にマトリクスを使用するのと同じです.しかし、これでは洛谷のテーマには通じない.タイトルリンク:https://www.luogu.org/problemnew/show/P3390
zxc大物の指摘1.n,kはlong longタイプ2であるべきである.高速べき乗の過程はans=Mul(ans,a,n)であるべきである.
MACコードは以下の通りである.
#include
#include
#define ll long long
#define mod 1000000007
using namespace std;
struct Mat{
	ll m[101][101];
};
Mat initMat(int n);
Mat Mul(Mat a,Mat b,int n);
Mat poww(Mat a,ll b);
Mat a,e;//a:   e:     
ll n;//     (  n   ) 
int main(){
	Mat a;
	ll k;//k Mat    
	cin>>n>>k;//input         
	for(int i=0;i>a.m[i][j];
		}
	}
	
	//   e
	for(int i=0;i

まとめ:
1.問題の範囲要求をよく見なければならない.高速べき乗のans=Mul(ans,base,n);よく理解すべきだ