一开始用unordered_map就tle了,以前看过他和map区别,但没太深印象,大概是哈希就用unordered_map,其他就用map吧。
sum[r]-pow(k,i)==sum[l]
枚举r,map记录r之前的l前缀和出现次数,每次累加即可。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+10;
const ll INF=1e14;
ll sum[N];
set<ll> s;
set<ll>::iterator ss;
map<ll,int> m;
int main(){
// freopen("in.txt","r",stdin);
int n,k;
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++){
ll x;scanf("%lld",&x);
sum[i]=sum[i-1]+x;
}
if(k==1){
s.insert(1);
}
else if(k==-1){
s.insert(1);
s.insert(-1);
}
else{
s.insert(1);
ll t=k;
for(int i=1;i<=60;i++){
if(t>INF) break;
s.insert(t);
t=t*k;
}
}
ll ans=0;
m.clear();
m[0]=1;
for(int i=1;i<=n;i++){
for(ss=s.begin();ss!=s.end();ss++){
ans+=m[sum[i]-*ss];
}
m[sum[i]]++;
}
printf("%lld\n",ans);
return 0;
}