Codeforces Round #400 (Div. 1 + Div. 2, combined) 776C Molly's Chemicals

来源:互联网 发布:微博怎么认证淘宝卖家 编辑:程序博客网 时间:2024/06/06 00:10

时间限制:1S / 空间限制:256MB

【在线测试提交传送门】

【问题描述】

    Molly Hooper has n different kinds of chemicals arranged in a line. Each of the chemicals has an affection value, The i-th of them has affection value ai.Molly wants Sherlock to fall in love with her. She intends to do this by mixing a contiguous segment of chemicals together to make a love potion with total affection value as a non-negative integer power of k. Total affection value of a continuous segment of chemicals is the sum of affection values of each chemical in that segment.Help her to do so in finding the total number of such segments.给定n个整数,和一个整数k,现在问你有多少个区间满足:该区间的各个数的和,等于k的x次方,其中x从0到无穷的非负整数。

【输入格式】

The first line of input contains two integers, n and k, the number of chemicals and the number, such that the total affection value is a non-negative power of this number k. (1 ≤ n ≤ 10^5, 1 ≤ |k| ≤ 10).Next line contains n integers a1, a2, ..., an ( - 10^9 ≤ ai ≤ 10^9) — affection values of chemicals.第一行,两个整数n和k (1 ≤ n ≤ 10^5, 1 ≤ |k| ≤ 10)。第二行,n个整数 a1, a2, ..., an ( - 10^9 ≤ ai ≤ 10^9) 。

【输出格式】

Output a single integer — the number of valid segments.输出一行,一个整数,表示符合要求的区间的数量。

【输入样例1】

4 22 2 2 2

【输出样例1】

8

【样例说明】

Do keep in mind that k0 = 1.In the first sample, Molly can get following different affection values: •区间和为2: segments [1, 1], [2, 2], [3, 3], [4, 4];  //2的1次方•区间和为4: segments [1, 2], [2, 3], [3, 4];           //2的2次方•区间和为6: segments [1, 3], [2, 4];                   //6不是k的x次方,不统计在内•区间和为8: segments [1, 4].                           //2的3次方Out of these, 2, 4 and 8 are powers of k = 2. Therefore, the answer is 8.符合要求的区间的数量共8个。In the second sample, Molly can choose segments [1, 2], [3, 3], [3, 4].在样例2中,共有3个区间符合要求。

【输入样例2】

4 -33 -6 -3 12

【输出样例2】

3

慎入:以下为解题思路和参考代码,请务必先自行思考!


这里写图片描述

【解题思路】

先求出前缀和,也就是求有多少个sum[r]-sum[l]=pow(k,x),r>l。x最大只有lg(1e14),可以将式子变为sum[r]-pow(k,x)=sum[l]。每次结束后将前缀和放到map里。

【参考代码】

#include<bits/stdc++.h>using namespace std;#define LL long longconst LL INF=1e14;int n;LL k,sum[100050];map<LL,LL>x;set<LL>a;set<LL>::iterator it;int main(){    while(~scanf("%d %lld",&n,&k))    {        x.clear();        a.clear();        sum[0]=0;        for(int i=1;i<=n;i++) scanf("%lld",&sum[i]),sum[i]+=sum[i-1];        a.insert(1);        LL temp=k;        for(int i=1;i<=60;i++)        {            if(temp>INF) break;            a.insert(temp);            temp*=k;        }        LL ans=0;        x[0]=1;        for(int i=1;i<=n;i++)        {            for(it=a.begin();it!=a.end();it++) ans+=x[sum[i]-*it];            x[sum[i]]++;        }        printf("%lld\n",ans);    }    return 0;}
阅读全文
0 0