今天又写了一遍,才差不多看懂这道题,不过stl的选择真的好难,靠经验么?
的核心就是 sum[r]-sum[l] = pow; 因为r在l的后面 所以要先由r来找l,在放入l,即转化为sum[l]=sum[r]-pow;
1 #include2 #include 3 #include 4 #define mem(a) memset(a,0,sizeof(a)) 5 #define ll long long 6 #define inf 0x3f3f3f3f 7 const int N=1e5+5; 8 const ll MAX=1e14+5; 9 const int mod=1e9+7;10 using namespace std;11 int p,q,y[N],tx,ty;12 ll a[N];13 int n,k,mx;14 set s;15 int main()16 {17 cin>>n>>k;18 for(int i=1;i<=n;i++)19 {20 cin>>a[i];21 a[i]=a[i]+a[i-1];22 }23 ll num=1,ans=0;24 for(int i=1;i<=60;i++)25 {26 s.insert(num);27 num*=k;28 if(num>MAX) break;29 }30 set ::iterator it;31 map mp;32 mp[0]=1; //要考虑从第一个数字开始到某一位的和正好是k的次方的可能33 for(int i=1;i<=n;i++)34 {35 for(it=s.begin();it!=s.end();it++)36 {37 ans+=mp[a[i]-*it]; //这里的a[i]-*it就表示r-pow 即为l38 }39 mp[a[i]]++; //a[i]先要作为r来跟pow来判断之前是否存在l,后来才能作为l40 }41 cout< <