传送门
题解:
对于与,我们只需要知道每一位上有多少个矩阵为全1。
对于或,我们只需要知道每一位上有多少个矩阵为全0。
单调栈维护一下就没了。
代码:
#include<bits/stdc++.h>
#define ll long long
#define re register
#define gc get_char
#define cs const
namespace IO{
inline char get_char(){
static cs int Rlen=1<<22|1;
static char buf[Rlen],*p1,*p2;
return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,Rlen,stdin),p1==p2)?EOF:*p1++;
}
template<typename T=int>
inline T gi(){
char c;T num;
while(!isdigit(c=gc()));num=c^48;
while(isdigit(c=gc()))num=(num+(num<<2)<<1)+(c^48);
return num;
}
}
using namespace IO;
using std::cerr;
using std::cout;
cs int mod=1e9+7;
inline int add(int a,int b){a+=b-mod;return a+(a>>31&mod);}
inline int dec(int a,int b){a-=b;return a+(a>>31&mod);}
inline int mul(int a,int b){ll r=(ll)a*b;return r>=mod?r%mod:r;}
inline void Inc(int &a,int b){a+=b-mod;a+=a>>31&mod;}
inline void Dec(int &a,int b){a-=b;a+=a>>31&mod;}
cs int N=1e3+7;
int mp[N][N],n,val[N][N];
inline int calc(int c){
static int h[N][N];
for(int re i=1;i<=n;++i)
for(int re j=1;j<=n;++j)h[i][j]=(mp[i][j]==c)?h[i-1][j]+1:0;
static int siz[N],ht[N],sum[N],t;int ans=0;
for(int re i=1;i<=n;++i){
t=0;
for(int re j=1;j<=n;++j){
int now_siz=1;
while(t&&ht[t]>=h[i][j])now_siz+=siz[t--];
ht[++t]=h[i][j];siz[t]=now_siz;
Inc(ans,sum[t]=add(sum[t-1],mul(ht[t],siz[t])));
}
}
return ans;
}
signed main(){
#ifdef zxyoi
freopen("andor.in","r",stdin);
#endif
n=gi();int ans1=0,ans2=0,tot=(ll)n*(n+1)*n*(n+1)/4%mod;
for(int re i=1;i<=n;++i)
for(int re j=1;j<=n;++j)val[i][j]=gi();
for(int re di=0,v=1;di<=30;++di,Inc(v,v)){
for(int re i=1;i<=n;++i)
for(int re j=1;j<=n;++j)mp[i][j]=val[i][j]>>di&1;
Inc(ans1,mul(v,calc(1)));
Inc(ans2,mul(v,dec(tot,calc(0))));
}
cout<<ans1<<" "<<ans2<<"\n";
return 0;
}