转自:http://blog.youkuaiyun.com/rain722/article/details/70049548
自己对于矩阵还是不够熟悉,,学一下这里的用法
#include<bits/stdc++.h>
#define ll long long
#define sf scanf
#define mem(a,b) memset(a,b,sizeof(a));
using namespace std;
const int mod=1e9+7;
const int maxn=1005;
ll qpow(ll a,ll k){
ll ret=1;
while(k){
if(k&1)ret=(ret*a)%mod;
k>>=1;
a=(a*a)%mod;
}
return ret;
}
int row[maxn][maxn],col[maxn][maxn];
int mat[maxn][maxn];
int main(){
int t;
scanf("%d",&t);
while(t--){
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
scanf("%d",&mat[i][j]);
row[i][j]=mat[i][j];
col[j][i]=mat[i][j];
}
}
for(int i=1;i<=n;++i){
sort(row[i]+1,row[i]+1+m);
}
for(int i=1;i<=m;++i){
sort(col[i]+1,col[i]+1+n);
}
ll ans=0;
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
int k1=lower_bound(col[j]+1,col[j]+1+n,mat[i][j])-col[j]-1;//对于某一列,找出比他小的数的个数
int k2=m-(upper_bound(row[i]+1,row[i]+1+m,mat[i][j])-row[i]-1);//对于某一行,找出比他大的数的个数
ans=(ans+qpow(2,k1)*qpow(2,k2)%mod)%mod;
}
}
cout<<ans<<'\n';
}
}
本文介绍了一种解决特定矩阵问题的方法,通过排序和快速幂运算来计算答案。使用C++实现,首先读取矩阵数据并对其进行行和列的排序,然后通过快速幂算法计算最终结果。
2015

被折叠的 条评论
为什么被折叠?



