矩阵快速幂(可以起到优化dp动态规划的作用)

a^b2

题目描述
求a^b 由于结果可能很大,我们现在只需要知道这个值mod 1012就可以了(为什么是1012?我的生日)
有N组数n<=5
a<=100
b<=maxlongint;

输入格式
第1行1个数 n第2到n+1行 两个数a,b
输出格式

n行 每个a^b mod 1012的值

样例输入
1
2 2

样例输出
4

#include<iostream>
using namespace std;
typedef long long ll;
ll fastpow(ll a,ll k,ll m){
    
    
	ll res=1;
	while(k){
    
    
		if(k&1)
		res=(res*a)%m;
	a=(a*a)%m;
	k>>=1;//k/2;
	}
	return res;
}
int main(){
    
    
	ll n,a,k;
	cin>>n;
	while(n--){
    
    
		cin>>a>>k;
		cout<<fastpow(a,k,1012)<<endl;
	}
	return 0;
}

矩阵乘法

题目描述
给出两个矩阵A和B,求两个矩阵相乘的结果C
相乘的方法是:假设矩阵A是n行m列的矩阵,矩阵B是m行k列的矩阵,矩阵C会得到一个n行k列的矩阵。
矩阵C中第i行,第j列的元素,值为:矩阵A的第i行,与矩阵B的第j列的对应元素,相乘相加的结果。
例如:A是4行3列的矩阵,B是3行2列的矩阵。
矩阵A为:
1 2 3
4 5 6
1 1 1
2 2 2
矩阵B为:
6 5
7 1
8 8
则:
C[1][1]=1*6+2*7+3*8=6+14+24=44;
C[1][2]=1*5+2*1+3*8=5+2+24=31;
C[2][1]=4*6+5*7+6*8=24+35+48=107;
C[2][2]=4*5+5*1+6*8=20+5+48=73;
C[3][1]=1*6+1*7+1*8=6+7+8=21;
C[3][2]=1*5+1*1+1*8=5+1+8=14;
C[4][1]=2*6+2*7+2*8=12+14+16=42;
C[4][2]=2*5+2*1+2*8=10+2+16=28;

输入格式
第一行三个正整数 n,m,k。( 0 < n,m,k < 100)
接下来的n行,每行m个数,表示矩阵A。
在后面的m行,每行k个数,表示矩阵B。

输出格式
输出矩阵C。

样例输入
4 3 2
1 2 3
4 5 6
1 1 1
2 2 2
6 5
7 1
8 8

样例输出
44 31
107 73
21 14
42 28

#include<iostream>
using namespace std;
const int MAX=110;
int a[MAX][MAX],b[MAX][MAX],c[MAX][MAX];
int n,m,k;
void mul(){
    
    
	for(int i=0;i<n;i++)
		for(int j=0;j<k;j++)
			for(int l=0;l<m;l++)
				c[i][j]+=a[i][l]*b[l][j];
}
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];
	mul();
	for(int i=0;i<n;i++){
    
    
		for(int j=0;j<k;j++)
			cout<<c[i][j]<<" ";
		cout<<endl;
	}
}

猜你喜欢

转载自blog.csdn.net/m0_51794965/article/details/111587771