题解:两个数组相乘后得n*m的矩形,求矩形中子矩形(仅包含1)面积为k的有多少个。
先统计a,b两个数组中连续1的长度,然后枚举i,i*i<=k,emmm详情见代码,很好理解的(比赛时枚举方法不对,重测超时TqT。。。。
经过朋友指导,重新写了一下)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=4e4+3;
int n,m,k;
int a[maxn],b[maxn];
ll ans;
int mp[maxn],t1;
int mq[maxn],t2;
int main(){
scanf("%d %d %d",&n,&m,&k);
for(int i=1;i<=n;i++) scanf("%d",a+i);
for(int i=1;i<=m;i++) scanf("%d",b+i);
int x=0;
for(int i=1;i<=m;i++){
if(b[i]==0){
if(x!=0) mp[t1++]=x;
x=0;
} else x++;
}
if(x!=0) mp[t1++]=x;
x=0;
for(int i=1;i<=n;i++){
if(a[i]==0){
if(x!=0) {
mq[t2++]=x;
}
x=0;
} else x++;
}
if(x!=0) mq[t2++]=x;
for(int i=1;i*i<=k;i++){
if(k%i==0){
ll num1=0,num2=0;
for(int j=0;j<t1;j++){
if(mp[j]>=i) num1+=(mp[j]-i+1);
}
for(int j=0;j<t2;j++){
if(mq[j]>=k/i) num2+=(mq[j]-k/i+1);
}
ans+=num1*num2;
if(i*i==k) break;
num1=num2=0;
for(int j=0;j<t1;j++){
if(mp[j]>=k/i) num1+=(mp[j]-k/i+1);
}
for(int j=0;j<t2;j++){
if(mq[j]>=i) num2+=(mq[j]-i+1);
}
ans+=num1*num2;
}
}
printf("%lld\n",ans);
return 0;
}