Codeforces-776C-Molly's Chemicals(前缀和)

来源:互联网 发布:读取股票数据 编辑:程序博客网 时间:2024/04/30 02:32

题目链接:Codeforces-776C-Molly's Chemicals

首先考虑到任意一个区间和都等于两个前缀和之差。

区间和为sum。sum=pre[r]-pre[l] 。

要求sum是k的幂次。我们可以枚举sum。最多有log_2(10^14)中可能的sum。

然后找满足r>l&&sum=pre[r]-pre[l]的个数即可。


#include<bits/stdc++.h>#define mp make_pair#define pr pair<ll,int>#define fi first#define se secondusing namespace std;typedef long long ll;const int maxn=1e5+7;const ll INF=1e14;map<ll,int> p;vector<int> a[maxn];ll pre[maxn];int cnt(ll k,int i){int t=p[k];if(!t)return 0;const vector<int>  &v=a[t];return v.end()-upper_bound(v.begin(),v.end(),i);}int main(){int n,m=0;ll k,t;cin>>n>>k;pre[0]=0;for(int i=1;i<=n;i++){cin>>t;pre[i]=pre[i-1]+t;if(!p[pre[i]])p[pre[i]]=++m;a[p[pre[i]]].push_back(i);}ll ans=0;for(int i=0;i<=n;i++){t=1;ans+=cnt(pre[i]+t,i);if(k==1)continue;t*=k;while(abs(t+pre[i])<=INF){ans+=cnt(pre[i]+t,i);if(t==-1)break;t*=k;}}cout<<ans<<endl;return 0;}


0 0
原创粉丝点击