cf #213 Matrix

题目:http://codeforces.com/contest/365/problem/C

题目分析:

sum(x,y,z,t)=s(x,y)*s(z,t),s(x,y)=s[x]+s[x+1]+...+s[y].

由于strlen(s)<=4000 因此s(x,y)<=9*4000,

然后枚举每个区间得到区间的和,再统计答案

程序:

#include <iostream>
#include <string>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;

long long eq,sum[5000],slen,f[46100],ssum,ans;
char s[5000];

void ini();
void work();
int main()
{
    ini();
    work();
    //cin>>eq;
    return 0;
}
void ini()
{
    ssum=sum[0]=ans=0;
    cin>>eq; 
    getchar();
    gets(s); 
    slen=strlen(s);
    memset(f,0,sizeof(f));
    for(int i=1;i<=slen;i++) {
        sum[i]=sum[i-1]+s[i-1]-'0';
    }
    ssum=sum[slen];
}
void work()
{
    for(int i=1;i<=slen;i++){
        for(int j=i;j<=slen;j++){
            f[sum[j]-sum[i]+s[i-1]-'0']++;
        }
    }
    if(eq==0){      //当eq==0时注意
        for(int i=1;i<=ssum;i++){
            ans+=f[i];
        }
        ans=2*ans*f[0];
        ans+=f[0]*f[0];
        cout<<ans<<endl;
        return;
    }
    for(int  i=1;i<=ssum;i++){
        if(eq>=i && eq/i<=ssum && eq%i==0){
            ans+=f[i]*f[eq/i];
        }
    }
    cout<<ans<<endl;
    return;
}
原文地址:https://www.cnblogs.com/au-xiaotian/p/3436499.html