显然一段区间的 mul - sum * k = 0 才合法,然鹅我们发现sum * k 对于本题的数据来说最大才是1e18,也就是说mul必须得<=1e18.
我们不妨从这里入手,因为mul最多只能乘log个>1的数,所以我们用lef[]记录每个数往左第一个不是1的数在哪,于是前后两个位置中间就是一坨子1,讨论一下就好啦。
#include#define ll unsigned long longusing 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