数学、枚举倍数

枚举 $i,j$ 并标记 $|S_i-S_j|$ 的值,一旦存在 $|S_i-S_j|=N \times K$,这个 $K$ 就不合法。枚举 $K$ 的值后对每个 $K$ 枚举倍数,最小的所有倍数都没有被标记的 $K$ 即为答案,时间复杂度 $O(n^2 + V \log V)$。

#include<bits/stdc++.h>
using namespace std;
constexpr int lim=1000000;
bool on[1000001];
int n,a[5001];
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    for(int i=1;i<=n;i++)
        for(int j=i+1;j<=n;j++) on[abs(a[i]-a[j])]=1;
    for(int i=1;i<=lim;i++){
        for(int j=i;j<=lim;j+=i) if(on[j]) goto nxt;
        printf("%d\n",i);
        break;
        nxt:continue;
    }
    return 0;
}
最后修改:2024 年 05 月 26 日
如果觉得我的文章对你有用,请随意赞赏