子矩阵的和=
sum(va(a~x)*sum(va(b~y))
要优化一下,a==0的情况要特殊考虑
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
typedef long long int LL;
LL x_array[5000],y_array[5000];
LL dx[50001],dy[50001];
int main()
{
int a;char str[5000];
LL cnt=0;
scanf("%d",&a);
scanf("%s",str);
int len=strlen(str);
for(int i=0;i<len;i++)
{
int j=i+1;
x_array[j]=x_array[j-1]+str[i]-'0';
y_array[j]=y_array[j-1]+str[i]-'0';
};
for(int i=1;i<=len;i++)
{
for(int j=i;j<=len;j++)
{
dx[x_array[j]-x_array[i-1]]++;
dy[y_array[j]-y_array[i-1]]++;
}
}
if(a!=0)
{
for(int i=1;i<50000;i++)
{
if(dx[i]&&a%i==0)
{
int temp=a/i;
if(temp>=50000) continue;
cnt+=dx[i]*dy[temp];
}
}
}
else if(a==0)
{
for(int i=1;i<50000;i++)
{
cnt+=dx[0]*dy[i]+dx[i]*dy[0];
}
if(dx[0]) cnt+=dx[0]*dy[0];
}
printf("%I64d\n",cnt);
return 0;
}