0
点赞
收藏
分享

微信扫一扫

快速求幂次1

小黑Neo 2022-04-06 阅读 24
算法

 

 

#include<bits/stdc++.h>
using namespace std;
const int N=100;
int A[N][N],B[N][N],C[N][N];
int n,m,k;
int multi(int  u, int v){
    int sum = 0;
    for (int j = 0; j < m; j++)
        sum += (A[u][j] * B[j][v]);
    return sum;
}
int main(){
    cin >> n >> m >> k;
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)   cin >> A[i][j];
    for(int i=0;i<m;i++)
        for(int j=0;j<k;j++)   cin >> B[i][j];

    for(int i=0;i<n;i++)
        for(int j=0;j<k;j++)  C[i][j] = multi(i, j);

    for(int i=0;i<n;i++){
        for(int j=0;j<k;j++)  cout << C[i][j] << " ";
        cout << endl;
    }
    return 0;
}

 

struct matrix{ int m[N][N]; };     //定义矩阵,常数N是矩阵的行数和列数
matrix operator * (const matrix& a, const matrix& b){
                    //重载*为矩阵乘法。注意const
    matrix c;   
    memset(c.m, 0, sizeof(c.m));  //清零
    for(int i=0; i<N; i++)
        for(int j=0; j<N; j++)
            for(int k = 0; k<N; k++)
              //c.m[i][j] += a.m[i][k] * b.m[k][j];    //不取模
              c.m[i][j] = (c.m[i][j] + a.m[i][k] * b.m[k][j]) % mod;//取模
    return c;
}
matrix pow_matrix(matrix a, int n){  //矩阵快速幂,代码和普通快速幂几乎一样
    matrix ans;   
    memset(ans.m,0,sizeof(ans.m));
    for(int i=0;i<N;i++)
        ans.m[i][i] = 1;      //初始化为单位矩阵,类似普通快速幂的ans=1
    while(n) {
        if(n&1) ans = ans * a;     //不能简写为ans *= a,这里的*重载了
        a = a * a;
        n>>=1;
    }
    return ans;
}

 

#include<bits/stdc++.h>
using namespace std;
const int N=40;
struct matrix{ int m[N][N]; };  //定义矩阵
matrix A,B;
matrix operator * (const matrix& a, const matrix& b){
                    //重载*为矩阵乘法。注意const
    matrix c;
    memset(c.m, 0, sizeof(c.m));  //清零
    for(int i=0; i<N; i++)
        for(int j=0; j<N; j++)
            for(int k = 0; k<N; k++)
              c.m[i][j] += a.m[i][k] * b.m[k][j];    //不取模
    return c;
}
matrix pow_matrix(matrix a, int n){  //矩阵快速幂
    matrix ans;
    memset(ans.m,0,sizeof(ans.m));
    for(int i=0;i<N;i++)
        ans.m[i][i] = 1;  
    while(n) {
        if(n&1) ans = ans * a;    
        a = a * a;
        n>>=1;
    }
    return ans;
}
int main(){
   int s,q; cin >>s>>q;   //s行s列,q次幂
   for(int i=1;i<=s;i++)
        for(int j=1;j<=s;j++)
            cin >> A.m[i][j];
    B = pow_matrix(A,q);
    for(int i=1;i<=s;i++){
        for(int j=1;j<=s;j++)  cout << B.m[i][j] << " ";
        cout << endl;
    }
    return 0;
}
import java.util.Scanner;
public class Main {
    static int n;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        int q = sc.nextInt();   //q次幂
        int[][] A;
        A = new int[n][n];
        for(int i = 0;i < n; i++)
            for(int j = 0; j < n; j++)
                A[i][j] = sc.nextInt();
        int[][] res = pow_matrix(A,q);
        for(int i = 0; i < n; i++) {          //打印
            for (int j = 0; j < n; j++)
                System.out.print(res[i][j]+" ");
            System.out.println();
        }
    }

    static int[][] pow_matrix(int[][] a, int q) {  //快速幂
        int[][] res = new int[n][n];
        for(int i = 0; i < n; i ++)
            res[i][i] = 1;
        while(q > 0) {
            if(q % 2 == 1)       res = multi(res, a);
            a = multi(a,a);
            q /= 2;
        }
       return res;
    }
    static int[][] multi(int[][] a, int[][] b) {   //矩阵乘法
        int[][] temp = new int[n][n];
        for(int i = 0; i < n; i ++)
            for(int j = 0; j < n;j++ )
                for(int k = 0; k < n; k++)
                    temp[i][j] += a[i][k]*b[k][j];
        return temp;
    }
}
def multi(A, B):
    m1, n1 = len(A), len(A[0])
    m2, n2 = len(B), len(B[0])
    if n1 != m2: return None
    C = [[0] * n2 for i in range(m1)]
    for i in range(m1):
        for k in range(n1):
            for j in range(n2):
                C[i][j] += A[i][k] * B[k][j]
    return C

def power(A, n):
    N = len(A)
    res = [[0] * N for i in range(N)]
    for i in range(N): 
        res[i][i] = 1
    while n:
        if n % 2:
            res = multi(res, A)
        A = multi(A, A)
        n //= 2
    return res

s, q = map(int, input().split())
A = []
for i in range(s):
    A.append(list(map(int, input().split())))
res = power(A, q)
for row in res:
    for c in row:
        print(c, end = ' ')
    print()

 

 

 

import math

mod = int(math.pow(10,9))+7

def multi(A, B):    #矩阵乘法
    C = [[0]*6 for i in range(6)]
    for i in range(6):
      for j in range(6):
         for k in range(6):
            C[i][j] = int((C[i][j] + A[i][k] * B[k][j]) % mod)
    return C

def power(A, n):    #矩阵快速幂
    res = [[0]*6 for i in range(6)]
    for i in range(6):
        res[i][i] = 1
    while n:
        if n % 2:
            res = multi(res, A)
        A = multi(A, A)
        n >>= 1
    return res

def solve(n, dice):
    transfer = [[4]*6 for i in range(6)]  #转移矩阵
    for i in range(6):                  #去掉互斥的情况
        for j in dice.get((i+3)%6,[]):  #0对面是3,1对4,2对5
            transfer[i][j]= 0
    transfer = power(transfer, n-1)     #转移矩阵乘n-1次
    temp = [4]*6                        #表示最下面的骰子
    ans = [0]*6
    for i in range(6):                  #最后乘最下面的骰子
        for j in range(6):
            ans[i] += transfer[i][j] * temp[j]
    print(int(sum(ans) % mod))

n, m = [int(str) for str in input().split()]
dice = dict()                  #用字典记录互相排斥的面
for i in range(m):
   x, y = [int(str)-1 for str in input().split()]
   if x not in dice:   dice[x] = [y]
   else:               dice[x].append(y)
   if y not in dice:   dice[y] = [x]
   else:               dice[y].append(x)
solve(n, dice)

 

 

举报

相关推荐

0 条评论