• 矩阵乘法
设A为 的矩阵,B为 的矩阵,那么称 的矩阵C为矩阵A与B的乘积,
其中矩阵C中的第 行第 列元素可以表示为:
///适用于行列相通的两个矩阵
#include<iostream>
using namespace std;
const int maxn=110;
int M[maxn][maxn],N[maxn][maxn],A[maxn][maxn];
int main(){
int n;cin>>n;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cin>>M[i][j];
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cin>>N[i][j];
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
for(int k=0;k<n;k++){
A[i][j]+=M[i][k]*N[k][j];
}
for(int i=0;i<n;i++){
for(int j=0;j<n-1;j++){
cout<<A[i][j]<<' ';
}
cout<<A[i][n-1]<<endl;
}
return 0;
}
• 快速幂
///求 n^n次方 最后一位数
#include<iostream>
using namespace std;
int main(){
int n,ans;
while(cin>>n){
ans=1;
int x=n,base=n;
while(x){
if(x&1)
ans=ans*base%10;
base=base%10*(base%10);
x>>=1;
}
cout<<ans<<endl;
}
return 0;
}
• 矩阵快速幂
#include <stdio.h>
#include <string.h>
using namespace std;
const int mod = 1000000009;
struct matrix {
long long a[2][2];
};
struct matrix mul(struct matrix a,struct matrix b) {
struct matrix ans;
memset(ans.a,0,sizeof(ans.a));
for(int i = 0; i < 2; i++) {
for(int j = 0; j < 2; j++) {
for(int k = 0; k < 2; k++) {
ans.a[i][j] = (ans.a[i][j] + ((a.a[i][k] * b.a[j][k]) % mod)) % mod;
}
}
}
return ans;
}
struct matrix mmul(struct matrix a,long long b){
struct matrix ans;
memset(ans.a,0,sizeof(ans.a));
ans.a[0][0] = 1;
ans.a[1][1] = 1;
while(b){
if(b & 1){
ans = mul(ans,a);
}
a = mul(a,a);
b >>= 1;
}
return ans;
}
int main() {
long long n;
struct matrix b,a;
b.a[0][0] = b.a[0][1] = b.a[1][0] = 1;
b.a[1][1] = 0;
memset(a.a,0,sizeof(a.a));
a.a[0][0] = 2;
a.a[0][1] = 1;
while(~scanf("%lld",&n)){
if(n == -1) break;
if(n == 0) {
printf("0\n");continue;
}
printf("%d\n",mmul(b,n - 1).a[0][0]);
}
return 0;
}