cf776c
Posted zsben991126
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cf776c相关的知识,希望对你有一定的参考价值。
这题用尺取法是怼不出来的。。。
一开始看到区间和等于k的幂,并且有负数,首先想到将前缀和排序后用尺取法,但因为排序后的前缀和次序是乱的,只适用带绝对值的情况(poj2566),所以无法做。
看了题解后发现其实是个简单的dp
//sum[r]=sum[l]+kk; //ans+=mp[sum[i]-kk];其实是个dp #include<bits/stdc++.h> using namespace std; #define ll long long #define maxn 100005 int n,a[maxn]; ll ans,kk,k,sum[maxn]; void solve(ll kk){ map<ll,int>mp; for(int i=0;i<=n;i++){ mp[sum[i]]++; ans+=mp[sum[i]-kk]; } } int main(){ scanf("%d%lld",&n,&k); sum[0]=ans=0; for(int i=1;i<=n;i++){ scanf("%d",&a[i]); sum[i]=sum[i-1]+a[i]; } if(k==1){ solve(1); printf("%lld ",ans); return 0; } if(k==-1){ solve(1);solve(-1); printf("%lld ",ans); return 0; } kk=1; while(kk<=(ll)1000000000*n){ solve(kk); kk*=k; } printf("%lld ",ans); return 0; }
以上是关于cf776c的主要内容,如果未能解决你的问题,请参考以下文章