C. Molly's Chemicals

这道题的思路跟C. Summarize to the Power of Two十分的相似。都是要求关于某个数的倍数。

优化方式都是用一个 map 来储存存在的数字,然后用某个数的幂次方减去当前遍历数字,看 map 是否存在有这个值。因为转化为幂次来做的话,幂次这一块复杂度不会超过1e2,而 n 最大为1e5,所以可解。

而该题不同的地方在于,它是一个连续片段,所以我们需要用到前缀和来优化,而且,因为它是连续片段的缘故,所以也只能够遍历一个数字,再在 map 中标记其存在。

for(int i=1;i<=n;++i)
            ans+=m[a[i]-t],m[a[i]]++;

代码:

// Created by CAD on 2020/1/12.
#include <bits/stdc++.h>
#define ll long long
using namespace std;

const int maxn=1e5+5;
map<ll,int> m;
ll a[maxn];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n,k;    cin>>n>>k;
    ll sum=0;
    for(int i=1;i<=n;++i)
        cin>>a[i],sum+=abs(a[i]),a[i]+=a[i-1];
    ll t=1,ans=0;
    while(abs(t)<=sum)
    {
        m.clear();
        m[0]=1;
        for(int i=1;i<=n;++i)
            ans+=m[a[i]-t],m[a[i]]++;
        t*=k;
        if(t==1) break;
    }
    cout<<ans<<endl;
    return 0;
}