SP31972 ADAPOWER - Ada and Power

发布时间 2023-08-17 23:09:35作者: Code_Fish_Hp

题目链接

题目大意

给定 \(1\) 个大小为 \(n \times n\) 的矩阵 \(a\),每次进行如下 \(2\) 种操作的其中一种:

  1. \(a_{i,j}(i \in[1,x],j \in[1,y])\) 的值加上 \(v\)

  2. 求出 \(a_{i,j}\) 的矩阵乘法,与输入的 \(b_{i,j}\) 比较,如果相等,输出 yes,否则输出 no

思路

对于操作 \(1\),暴力遍历并更改矩阵值即可。

对于操作 \(2\),暴力求出每个点的矩阵乘法值,然后比较即可。

\(S_{i,j}\)\(a_{i,j}\) 的矩阵乘法,可得以下公式:

\[S_{i,j}= \sum_{k=0}^{k<n} a_{i,k} \times a_{k,j} \]

最后暴力枚举即可,时间复杂度 \(O(qn^3)\)

参考代码(请勿抄袭):

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN=200;
int a[MAXN][MAXN],newa[MAXN][MAXN],n,q,fx,fy,ex,ey,v;
signed main(){
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	cin>>n>>q;
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			cin>>a[i][j];
		}
	}
	while(q--){
		int op;
		cin>>op;
		if(op==1){
			cin>>fx>>fy>>ex>>ey>>v;
			for(int i=fx;i<=ex;i++){
				for(int j=fy;j<=ey;j++){
					a[i][j]+=v;//暴力修改 
				}
			}
		}
		else if(op==2){
			bool flag=1;
			for(int i=0;i<n;i++){
				for(int j=0;j<n;j++){
					cin>>newa[i][j];//输入新矩阵 
				}
			}
			for(int i=0;i<n;i++){
				for(int j=0;j<n;j++){
					int sum=0;
					for(int k=0;k<n;k++){
						sum+=a[i][k]*a[k][j];//矩阵乘法 
					}
					if(sum!=newa[i][j]){//不满足 
						flag=0;
						break;//退出循环 
					}
				}
				if(!flag) break;//如果不满足,退出循环 
			}
			if(flag) cout<<"yes"<<endl;
			else cout<<"no"<<endl;
		}
	}
	return 0;
}