CodeForces - 992D Nastya and a Game
显然一段区间的 mul - sum * k = 0 才合法,然鹅我们发现sum * k 对于本题的数据来说最大才是1e18,也就是说mul必须得<=1e18.
我们不妨从这里入手,因为mul最多只能乘log个>1的数,所以我们用lef[]记录每个数往左第一个不是1的数在哪,于是前后两个位置中间就是一坨子1,讨论一下就好啦。
#include<bits/stdc++.h> #define ll unsigned long long using namespace std; const int maxn=200005; const ll inf=(ll)1e19; inline int read(){ int x=0; char ch=getchar(); for(;!isdigit(ch);ch=getchar()); for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0'; return x; } int a[maxn],n,k,lef[maxn]; ll sum,mul,ans,w; inline void solve(){ const int ha=k; for(int i=1;i<=n;i++){ sum=mul=a[i],ans+=(k==1); for(int pre=i,now=lef[i];;pre=now,now=lef[now]){ w=mul-sum*(ll)k; if(w>0&&w%ha==0&&w/ha<pre-now) ans++; if(!now||inf/a[now]<mul) break; mul*=(ll)a[now],sum+=(ll)a[now]+pre-now-1; ans+=(mul==sum*(ll)k); } } } int main(){ // freopen("data.in","r",stdin); // freopen("data.out","w",stdout); n=read(),k=read(); for(int i=1;i<=n;i++){ a[i]=read(); lef[i]=(a[i-1]!=1?i-1:lef[i-1]); } solve(); cout<<ans<<endl; return 0; }
我爱学习,学习使我快乐