SP31972 ADAPOWER - Ada and Power
题目链接
题目大意
给定 \(1\) 个大小为 \(n \times n\) 的矩阵 \(a\),每次进行如下 \(2\) 种操作的其中一种:
-
将 \(a_{i,j}(i \in[1,x],j \in[1,y])\) 的值加上 \(v\)。
-
求出 \(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;
}