zoukankan      html  css  js  c++  java
  • Codeforces 365C

    题意:给定你一个数串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 }
    View Code
    没有梦想,何谈远方
  • 相关阅读:
    HDU 5313 bitset优化背包
    bzoj 2595 斯坦纳树
    COJ 1287 求匹配串在模式串中出现的次数
    HDU 5381 The sum of gcd
    POJ 1739
    HDU 3377 插头dp
    HDU 1693 二进制表示的简单插头dp
    HDU 5353
    URAL 1519 基础插头DP
    UVA 10294 等价类计数
  • 原文地址:https://www.cnblogs.com/zyue/p/3434319.html
Copyright © 2011-2022 走看看