题意:给出n个数,|ai|<=1e9 问有多少条连续线段的和为k的幂次(n<=1e5,|k|<=10)
线段最大和为1e14,k最多开50次幂吧2^40 -1只有1,-1
求区间和为x的个数,枚举右端点,合法的左端点l满足,满足前缀和l=pre[r]-x,用map保存前缀和为i的个数即可
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+20;
const ll M=1e15;
ll a[N],pre[N];
vector<ll> b;
map<ll,ll> mp;//前缀和为i的线段个数
int main()
{
ll n,k;
while(cin>>n>>k)
{
mp.clear();
pre[0]=0;
for(int i=1;i<=n;i++)
{
scanf("%I64d",&a[i]);
pre[i]=pre[i-1]+a[i];
}
ll x;
if(k==1)
b.push_back(1);
else if(k==-1)
{
b.push_back(1);
b.push_back(-1);
}
else
for(int i=0;i<=50;i++)//k^i
{
if(i==0)
x=1;
else
x=x*k;
if(abs(x)>M)
break;
b.push_back(x);
}
ll ans=0;
for(int i=0;i<b.size();i++)
{
ll x=b[i];
mp.clear();
mp[0]=1;
for(int j=1;j<=n;j++)//以j为区间右端点
{
//合法左端点个数
ans+=mp[pre[j]-x];
// cout<<x<<' '<<j<<endl;
mp[pre[j]]++;
}
}
cout<<ans<<endl;
}
return 0;
}