https://codeforces.com/problemset/problem/776/C
前缀和的应用
先计算出前缀和,然后对每个前缀和查找它加上k的非负幂次后面有没有这个数值的前缀和后,然后计算总和。
时间复制度nlogn。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e5+10;
ll a[N],sum[N];
int main()
{
ios::sync_with_stdio(0);
int n,k;
cin >> n >> k;
for(int i=1;i<=n;++i)
{
cin >> a[i];
sum[i]=sum[i-1]+a[i];
}
if(abs(k)!=1)
{
map<ll,int> m;
ll ans=0;
for(int i=n;i>=0;--i)
{
ll r=1;
while(abs(r)<1e15)
{
if(m.find(sum[i]+r)!=m.end())
ans+=m[sum[i]+r];
r*=k;
}
m[sum[i]]++;
}
cout << ans << endl;
}
else
{
if(k==1)
{
map<ll,int> m;
ll ans=0;
for(int i=n;i>=0;--i)
{
if(m.find(sum[i]+1)!=m.end())
ans+=m[sum[i]+1];
m[sum[i]]++;
}
cout << ans << endl;
}
else if(k==-1)
{
map<ll,int> m;
ll ans=0;
for(int i=n;i>=0;--i)
{
if(m.find(sum[i]+1)!=m.end())
ans+=m[sum[i]+1];
if(m.find(sum[i]-1)!=m.end())
ans+=m[sum[i]-1];
m[sum[i]]++;
}
cout << ans << endl;
}
}
}