51Nod

•  矩阵乘法

A为  的矩阵,B为  的矩阵,那么称  的矩阵C为矩阵AB的乘积,

其中矩阵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;
}

猜你喜欢

转载自www.cnblogs.com/Y292/p/9147128.html