P10171
Retired_lvmao · · 题解
题解
提供一个很可能是乱搞的做法。
首先,先判掉存在两个
再此基础上,可以注意到
观察到一个 check 的复杂度是
又注意到,根据抽屉原理,合法的
代码
#include<bits/stdc++.h>
using namespace std;
int n,l,r;
int a[200010];
int vis[400010];
int maxn=4e5;
int main()
{
scanf("%d%d%d",&n,&l,&r);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
sort(a+1,a+n+1);
for(int i=2;i<=n;i++)
if(a[i]==a[i-1])
{
puts("0");
return 0;
}
for(int i=1;i<n;i++)
{
int pos=lower_bound(a+1,a+n+1,a[i]+n)-a;
for(int j=pos;j<=n;j++)
vis[a[j]-a[i]]=1;
}
int sum=max(r-maxn,0);
for(int i=1;i<=maxn;i++)
{
for(int j=i+i;j<=maxn;j+=i)
vis[i]|=vis[j];
// if(vis[i])
// cout<<i<<endl;
sum+=(vis[i]==0&&i>=l&&i<=r&&i>n);
}
printf("%d\n",sum);
}