#include<bits/stdc++.h>
using namespace std;
int n,m,z,kmax=0,mod=10000007;
int a[1005][1005][35],b[2005][2005],dp1[1005][1005],dp0[1005][1005],h[2005];
long long ans1=0,ans0=0;
string s;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
scanf("%d",&z);
// cout<<"z="<<z;
for(int k=1;z;k++,z/=2){
if(z&1)a[i][j][k]=1;
kmax=max(kmax,k);
}
}
}
for(int k=1;k<31;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(a[i][j][k]) dp1[i][j]=dp1[i][j-1]+1,dp0[i][j]=0;
else dp1[i][j]=0,dp0[i][j]=dp0[i][j-1]+1;
}
}
// for(int i=1;i<=n;i++){
// for(int j=1;j<=n;j++){
// cout<<dp0[i][j]<<" ";
// }
// cout<<endl;
// }
// cout<<endl;
long long ans=0;
for(long long j=1,x=0,sum=0;j<=n;j++,x=0,sum=0){
for(int i=1;i<=n;i++){
// if(a[i][j][k]) continue;
sum+=dp0[i][j];
while(x&&dp0[h[x]][j]>=dp0[h[x]][j]){
sum-=(h[x]-h[x-1])*(dp0[h[x]][j]-dp0[i][j]);
x--;
}
ans0+=(i*j-sum)<<(k-1);
ans0%=mod;
h[++x]=i;
}
}
// cout<<"ans0="<<ans0<<endl;
// ans0=(ans0+(m
ans=0;
for(long long j=1,x=0,sum=0;j<=n;j++,x=0,sum=0){
for(int i=1;i<=n;i++){
// if(a[i][j][k]==0) continue;
sum+=dp1[i][j];
while(x&&dp1[i][j]<=dp1[h[x]][j]){
sum-=(h[x]-h[x-1])*(dp1[h[x]][j]-dp1[i][j]);
x--;
}
ans1+=sum<<(k-1);
ans1%=mod;
h[++x]=i;
// cout<<ans<<" ";
}
// cout<<endl;
}
// ans1=(ans1+ans*(1<<(k-1)))%mod;-ans)*(1<<(k-1)))%mod;
}
cout<<ans1<<" "<<ans0<<endl;
}
/*
4
0 1 1 1
0 1 1 1
0 0 0 0
0 0 0 0
*/
提交20分,WA4个T4个,有没有大佬帮看看哪里出bug了)感激不尽QAQ
调了一周了,人已经麻了,现在开始胡言乱语()