zoukankan      html  css  js  c++  java
  • 【NOIP2015模拟10.22】矩形

    Description
    给定一个由数字(0-9)构成的字符串s。我们可以由此定义出size(s) * size(s) 大
    小的矩阵b,其中b[i][j] = s[i] * s[j];请问在这个矩阵b中,有多少子矩形满足其中的b[i][j]的和为另一个给定的数字a。

    Input
    第一行一个整数a。
    第二行字符串s。

    Output
    一个整数表示满足条件的子矩形数。

    Sample Input
    10
    12345

    Sample Output
    6
    【样例解释】
    b 矩阵为:
    01 02 03 04 05
    02 04 06 08 10
    03 06 09 12 15
    04 08 12 16 20
    05 10 15 20 25
    和为 10 的子矩形有:

    一、01 02 03 04

    二、
    01
    02
    03
    04

    三、04 06

    四、
    04
    06

    五、10

    六、10

    以上共六个。

    Data Constraint
    对 10%的输入数据:size(s)≤10
    对30%的输入数据:size(s)≤100
    对100%的输入数据:0 ≤a≤1000000000,size(s)≤4000
    .
    .
    .
    .
    .
    .

    分析

    由于b[i][j] = s[i] * s[j],则矩阵的第一行和第一列为原序列,且下面所有矩阵的和都是第一行子矩阵的和的倍数,也就是第一行的子矩阵和第一列的子矩阵的乘积。即要枚举出符合提议的矩阵,应先找第一行的数,然后用找符合a/sum[x1…x2](指第一行从x1到x2的和)=sum[y1…y2](指第一列从y1到y2的和)的子矩阵的值分别有多少个,再把两个数乘起来累加。
    但如果a=0,则上述方法不成立,当sum[x1…x2]=0时,sum[y1…y2]可以取任何值。
    .
    .
    .
    .
    .

    程序:
    #include<iostream>
    #include<string.h>
    using namespace std;
    
    int n,l,a[4001],b[36001];
    long long ans=0;
    char s[4001];
    
    int main()
    {
        cin>>n;
        cin>>s+1;
        l=strlen(s+1);
        for (int i=1;i<=l;i++)
        a[i]=a[i-1]+(s[i]-'0');      
        for (int i=1;i<=l;i++)
        for (int j=i;j<=l;j++)
        b[a[j]-a[i-1]]++;    
        if (n!=0)
        {
            for (int i=1;i<=l;i++)
            for (int j=i;j<=l;j++)
            {
                int t=a[j]-a[i-1];
                if (t==0) continue;
                if (n%t!=0||(n/t)>36000) continue;
                ans+=b[n/t];
            }
        }       
        else
        {
            for (int i=1;i<=l;i++)
            for (int j=i;j<=l;j++)
            {
                int t=a[j]-a[i-1];
                if (t==0) ans+=l*(l+1)/2; else ans+=b[0];
            }
        }
        cout<<ans;
        return 0;
    }
  • 相关阅读:
    如何使用Flash来实现本地存储.续
    一个简单自动监控nginx 504错误的php脚本
    Spark,一种快速数据分析替代方案
    使用浏览器原生函数优化动画
    QWrap简介之核心库定制
    计算tcp每秒并发数一则
    Sina的CMS模型
    Web 2.0 桌面与移动应用程序安全性设计
    FLEXmadel模态窗口透明度设置
    使用 ASM 实现 Java 语言的“多重继承”
  • 原文地址:https://www.cnblogs.com/YYC-0304/p/9499931.html
Copyright © 2011-2022 走看看