https://blog.csdn.net/Haipai1998/article/details/80740649
题意:给定一个Arr[n],求满足multipul[L,R]/sum[L,R]==k的区间个数
思路:对于a[i]==1的情况,因为对multipul是没有影响的,只影响L,R。那么对于连续的区间1我们就可以跳,只要sum[L,R]∈[sum/multiple,sum/multiple+ lenof[1] ]。根据数据有multipul不会超过2e18。那么根据以上的做法,因为每次乘的数都是≥2的,第二层while循环的次数不会超过61次。复杂度为O(60*n)
int N,K;
ll A[202020];
ll S[202020];
int nex[202020];
void solve() {
int i,j,k,l,r,x,y; string s;
cin>>N>>K;
FOR(i,N) cin>>A[i];
x=N;
for(i=N-1;i>=0;i--) {
nex[i]=x;
if(A[i]!=1) x=i;
}
ll ret=0;
FOR(i,N) {
int R=i;
ll p=1;
ll s=0;
while(R<N) {
if((double)p*A[R]>3e18) break;
p*=A[R];
s+=A[R];
int add=nex[R]-R-1;
///下面一个if是关键 利用了全是1的单调性(只减不增)判断区间是否有某个a加入后满足条件
if(p%K==0) {
if(s*K<=p && p<=(s+add)*K) ret++;
}
s+=add;
R=nex[R];
}
}
cout<<ret<<endl;
}