当前位置: 代码迷 >> 综合 >> cf-213-div1-A. Matrix
  详细解决方案

cf-213-div1-A. Matrix

热度:56   发布时间:2023-12-19 11:00:51.0

当时比赛的时候弱爆了,当时只往求数组和上想了,没有想到这个问题的本质。

做法:
题目相当于就是取两节子字符串,然后把这两节子字符串的和相乘等于a。

ns[i]:  子字符串的和等于i的子字符串的个数。

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define ll __int64
ll num[4040];
ll add[4040];
ll ns[40400];
int main()
{ll a;char str[4040];ll i,j;while(~scanf("%I64d",&a)){ll sum;sum=0;memset(ns,0,sizeof(ns));scanf("%s",str);ll len=strlen(str);for(i=0;i<len;i++){num[i+1]=str[i]-'0';}for(i=1;i<=len;i++){add[i]=add[i-1]+num[i];}ll as;as=0;for(i=1;i<=len;i++){for(j=0;j<i;j++){ll nn=add[i]-add[j];ns[nn]++;as++;}}if(a==0){ll bs=ns[0];as=as-bs;sum=as*bs*2+bs*bs;}else{sum=0;for(i=1;i<=40000;i++){if(a/i>40000)continue;if(a%i==0){sum+=ns[i]*ns[a/i];}}}cout<<sum<<endl;}return 0;
}


  相关解决方案