题意:给定n个数字和一个k,问区间的一段数字加起来是k的幂的区间数。
思路:对n个数求前缀和,记录下前缀和的种数(即前缀中能得到值s的种数),然后对每个k的幂(power)求sum-
power的和。在其前缀中有多少种方式组成sum-power,那么当前就能多少种power。
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+5;
typedef long long ll;
int a[maxn], n, k;
map<ll, int> m;
int main(void)
{
while(cin >> n >> k)
{
for(int i = 0; i < n; i++)
scanf("%d", &a[i]);
ll p = 1, sum, ans = 0;
while(abs(p) < 1e15)
{
m.clear();
m[0] = 1;
sum = 0;
for(int i = 0; i < n; i++)
{
sum += a[i];
ans += m[sum-p];
m[sum]++;
}
p *= k;
}
printf("%I64d", ans);
}
return 0;
}