一看到“末尾有几个 ”,就能想到只和因子
有关,子段答案就是
然后套路是把“恰好 ”改成“至少
减至少
”,前缀和配双指针线性统计就行。
void solve(){
int n;ll k;cin>>n>>k;
vi a(n+1);
for(int i=1;i<=n;++i)cin>>a[i];
vll p2(n+1),p5(n+1);
for(int i=1;i<=n;++i){
int x=a[i],c2=0,c5=0;
while(x%2==0){
x/=2;
++c2;
}
while(x%5==0){
x/=5;
++c5;
}
p2[i]=p2[i-1]+c2;
p5[i]=p5[i-1]+c5;
}
auto work=[&](ll kk)->ll{
ll res=0;
int i2=-1,i5=-1;
for(int i=1;i<=n;++i){
while(i2+1<=n&&p2[i2+1]<=p2[i]-kk)++i2;
while(i5+1<=n&&p5[i5+1]<=p5[i]-kk)++i5;
int t=min(i-1,min(i2,i5));
if(t>=0)res+=t+1;
}
return res;
};
ll ans=work(k)-work(k+1);
cout<<ans<<endl;
}

京公网安备 11010502036488号