Description
Input
Output
Sample Input
3 2
5 3 1
Sample Output
4
Data Constraint
Solution
首先,“坏对”必须是两个数,答案先加上 N ,即单个数的情况。
接着,我们用两个指针
l,r ,表示符合条件的区间。每次把 r 右移一位,表示新加入一个数
a[r] 。之后我们就要维护 l 指针,以满足条件。
用一个桶,存区间中出现的数的数量,枚举因数看是否存在“坏对”。
就这样不断右移
l 指针直到符合条件,最后答案加上 r−l 即可。
Code
#include<cstdio>
using namespace std;
const int N=100001;
int n,k,mx;
long long ans;
int a[N],t[N];
inline int read()
{
int X=0,w=1; char ch=0;
while(ch<'0' || ch>'9') {if(ch=='-') w=-1;ch=getchar();}
while(ch>='0' && ch<='9') X=(X<<3)+(X<<1)+ch-'0',ch=getchar();
return X*w;
}
int main()
{
ans=n=read(),k=read();
for(int i=1;i<=n;i++)
{
a[i]=read();
if(a[i]>mx) mx=a[i];
}
int l=1,r=1;
t[a[1]]=1;
while(++r<=n)
{
if(a[r]>k)
for(int i=0;i<=mx;i++)
{
int p=i*a[r]+k;
if(p>mx) break;
while(t[p]) t[a[l++]]--;
}
t[a[r]]++;
ans+=r-l;
}
printf("%lld",ans);
return 0;
}