You are on page 1of 2

#include <bits/stdc++.

h>
using namespace std;
#define ll long long
#define rep(i,a,n) for(int i=a ; i<n ; i++)
#define INF (int)1e9
inline int read_int(){
char r;
bool start=false,neg=false;
int ret=0;
while(true){
r=getchar();
if((r-'0'<0 || r-'0'>9) && r!='-' && !start){
continue;
}
if((r-'0'<0 || r-'0'>9) && r!='-' && start){
break;
}
if(start)ret*=10;
start=true;
if(r=='-')neg=true;
else ret+=r-'0';
}
if(!neg)
return ret;
else
return -ret;
}
inline void printint(ll a)
{
char s[13];
int t = -1;
do{
s[++t] = a % 10 + '0';
a /= 10;
} while(a > 0);
while(t >= 0) putchar_unlocked(s[t--]);
putchar_unlocked('\n');
}
int main()
{
int TESTS=1;
TESTS = read_int();
for(int qq = 1; qq<=TESTS; ++qq)
{
printf("Case #%d: ", qq);
ll ans = 0;
int n;
n = read_int();
short a[n];
rep(i,0,n) a[i] = read_int();
int mn = INF, mx = -INF;
int cur = 0;
rep(i,0,n){
cur += a[i];
if(cur < 0) cur = 0;
mx = max(mx, cur);
}
unordered_map<int,int> m;
m.reserve(1048576);
m.max_load_factor(0.25);
cur = 0;
unordered_set<int> s;
rep(i,0,n){
cur += a[i];
mx = max(mx, cur);
s.insert(cur);
}
rep(l,0,3164){
if(s.find(l*l)!=s.end()) m[l*l]++;
}
cur = 0;
rep(i,0,n){
cur += a[i];
ans += m[cur];
rep(l,0,3164){
if(l*l+cur > mx) break;
if(s.find(cur+l*l)!=s.end()) m[cur+l*l]++;
}
}
printint(ans);
}
}

You might also like