解题报告:题目问的是存在区间使得区间和为k的n次幂的方案数,即s[r]-s[l]==pow(k,i) , 由于i很小,那么我们枚举右端点 通过map来记录前面前缀和出现的次数。
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
#include<map>
#include<set>
#include<cmath>
using namespace std;
typedef long long ll;
const int N=100010;
const int mod=1e9+7;
ll s[N];
int n,k;
ll a[N];
map<ll,int>mp;
vector<ll>Q;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin >> n >> k;
mp[0]++;
ll res=0;
for(int i=0;i<60;i++)
{
Q.push_back((ll)pow(k,i));
if(k==1 ) break;
if(k==-1 && i==1) break;
if((ll)pow(k,i)>1e14) break;
}
for(int i=1;i<=n;i++)
{
cin >> a[i];
s[i] = s[i-1] + a[i];
for(auto x:Q)
{
res+=mp[s[i]-x];
}
mp[s[i]]++;
}
cout<<res<<endl;
return 0;
}