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; }