Codeforces 365C - Matrix(hash + yy)
生活随笔
收集整理的這篇文章主要介紹了
Codeforces 365C - Matrix(hash + yy)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:給定你一個數串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\n",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\n",ans); 46 return 0; 47 } View Code?
轉載于:https://www.cnblogs.com/zyue/p/3434319.html
總結
以上是生活随笔為你收集整理的Codeforces 365C - Matrix(hash + yy)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何判断一个字符串是不是纯数字
- 下一篇: 1988-B. 有序集合