题意:给定你一个数串s,再给你一个 a ,问你在矩阵d(第i,j个元素为si*sj)有多少个小矩形的和为a
解题思路:可知 a = (s[x] + s[x+1] + ....s[y])* (s[p]+s[p+1]+....s[q]); 我们只需要枚举各字串的和以及其个数就可以得到所求小矩形的个数
解题代码:
1 #include <stdio.h> 2 #include <string.h> 3 char a[4005]; 4 __int64 b[4005]; 5 __int64 hs[40005]; 6 __int64 sum[4005]; 7 int main() 8 { 9 __int64 k ; 10 scanf("%I64d",&k); 11 scanf("%s",a); 12 memset(hs,0,sizeof(hs)); 13 __int64 len = strlen(a); 14 for(__int64 i= 0 ;i < len ;i ++) 15 { 16 b[i+1] = a[i] - '0'; 17 } 18 sum[0] = 0 ; 19 sum[1] = b[1]; 20 for(__int64 i = 1;i <= len;i ++) 21 sum[i] = sum[i-1] + b[i]; 22 23 for(__int64 i = 0;i <= len;i ++) 24 for(__int64 j = i+1; j<= len ; j ++ ) 25 { 26 hs[sum[j] - sum[i]] ++; 27 } 28 29 // printf("%I64d %I64d ",hs[0],hs[1]); 30 __int64 ans = 0 ; 31 if(k != 0 ){ 32 for(__int64 i = 1;i <= 40000;i ++) 33 { 34 if(k % i == 0 && (k / i) <= 40000) 35 ans += hs[i] * hs[k/i]; 36 } 37 } 38 else 39 { 40 ans = hs[0] *hs[0]; 41 for(int i = 1 ;i <= 40000;i ++) 42 ans += hs[i]*hs[0]*2; 43 44 } 45 printf("%I64d ",ans); 46 return 0; 47 }