CodeForces 776C Molly's Chemicals

来源:互联网 发布:jdk1.8 linux 32 下载 编辑:程序博客网 时间:2024/05/17 01:35

题目链接:http://codeforces.com/contest/776/problem/C
题意:给你一个序列,问你他有多少个子序列的和等k的多少次方
解析:先用前缀和处理子序列的和,如果枚举每个子序列的和即sum[i]-sum[j]=k^x,肯定会超时,那么可以做一个变换即sum[i]-k^x=sum[j],这样的姿势就能过了

#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <iostream>#include <vector>#include <queue>#include <string>#include <set>#include <stack>#include <map>using namespace std;const int maxn = 1e5+100;int a[maxn];long long sum[maxn];map<long long,int>maple;long long ans,n,k;void slove(long long x){    maple.clear();    for(int i=0;i<n;i++)    {        maple[sum[i]]++;        if(maple[sum[i+1]-x])            ans += maple[sum[i+1]-x];    }}int main(){    scanf("%I64d %I64d",&n,&k);    for(int i=0;i<n;i++)        scanf("%d",&a[i]);    sum[1] = a[0],ans = 0;    for(int i=2;i<=n;i++)        sum[i] = sum[i-1]+a[i-1];    if(k==1)        slove(1);    else if(k==-1)    {        slove(1);        slove(-1);    }    else    {        long long tmp = 1;        while(tmp<1e15)        {            slove(tmp);            tmp*=k;        }    }    printf("%I64d\n",ans);    return 0;}
0 0
原创粉丝点击