时间限制:C/C++ 2秒,其他语言4秒
空间限制:C/C++ 65536K,其他语言131072K
64bit IO Format: %lld
空间限制:C/C++ 65536K,其他语言131072K
64bit IO Format: %lld
题目描述
星神是来自宇宙的
所以珂朵莉也是吧
所以我就出了个题
给你一个长为n的序列a,有n*(n+1)/2个子区间,问这些子区间里面和为完全平方数的子区间个数
输入描述:
第一行一个数n 第二行n个数表示序列a
输出描述:
输出一个数表示答案
示例1
输入
6 0 1 0 9 1 0
输出
11
备注:
1 <= n <= 100000
0 <= ai <= 10
sum[r]-sum[l-1]=x*x
sum[r]-x*x=sum[l-1]
这样一转化,只需要枚举r和x,就把原来的O(n*n)转换为了O(n*x)
由于所有的总和就1e6,x只有1000,暴力枚举即可
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll num[1100000];
ll sum[100005];
int main()
{
ll cnt=0;
ll n,x;
scanf("%lld",&n);
for(ll i=1; i<=n; i++)
{
scanf("%lld",&x);
sum[i]=sum[i-1]+x;
}
num[0]++;
for(ll i=1;i<=n;i++)
{
for(ll j=0;j<=1000;j++)
{
ll tmp=sum[i]-j*j;
if(tmp>=0)
{
cnt+=num[tmp];
}
}
num[sum[i]]++;
}
printf("%lld\n",cnt);
return 0;
}