记录一下r[i],右边第一个不是1的数的位置,不会太多
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <cmath>
#include <vector>
using namespace std;
long long n,k;
long long a[200005];
int r[200005];
int main() {
while(~scanf("%lld%lld",&n,&k))
{
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
int sta=n+1;
for(int i=n;i>=1;i--)
{
r[i]=sta;
if(a[i]!=1)
sta=i;
}
long long ans=0;
for(int i=1;i<=n;i++)
{
long long mul=a[i];
long long sum=a[i]*k;
int cur=i;
while(1)
{
int nex=r[cur];
long long cnt1=nex-cur-1;
if((mul>=sum) && (mul-sum)%k==0 && (mul-sum)/k <=cnt1)
{
ans++;
}
if(nex>n)
break;
if(mul>= (2e18+1)/a[nex])
break;
mul*=a[nex];
sum+=(cnt1*k+k*a[nex]);
cur=nex;
}
}
printf("%lld\n",ans);
}
return 0;
}