Integers Have Friends 2.0 题解(随机+同余)

题目链接

题目思路

又是一个随机题目,对于\(\frac{1}{2}\)的概率这种东西大多都是随机

官方题解写的很好,我直接放官方题解

还有一点就是为什么只要枚举质因子而不要全部枚举因子

如果\(a,b,c\)对于\(m\)同余,那么他们的差分数组\(mod \;m\)\(0\)

所以相当于枚举差分数组的质因子即可得到答案

注意\(ans\)要初始化为\(1\)

代码

#include<bits/stdc++.h>
#define fi first
#define se second
#define debug printf(" I am here\n");
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
mt19937 rnd(time(0));
const ll INF=0x3f3f3f3f3f3f3f3f;
const int maxn= 2e6 +5,inf=0x3f3f3f3f,mod=20071027;
const double eps=1e-10;
int n;
ll a[maxn];
int ans=0;
int prime[maxn],cnt;
bool isprime[maxn];
void getprime(int n){
    for(ll i=2;i<=n;i++){//开ll因为后面要计算i*prime[j]
        if(!isprime[i]){
            prime[++cnt]=i;
        }
        for(int j=1;j<=cnt&&i*prime[j]<=n;j++){
            isprime[i*prime[j]]=1;
            if(i%prime[j]==0) break;
        }
    }
}
int cal(ll mo,ll yu){
    int cnt=0;
    for(int i=1;i<=n;i++){
        if(a[i]%mo==yu) cnt++;
    }
    return cnt;
}
signed main(){
    getprime(2000000);
    int _;scanf("%d",&_);
    while(_--){
        ans=1;
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%lld",&a[i]);
        }
        for(int i=1;i<=30;i++){
            ll x=-1,y=-1;
            while(x==y){
                x=rnd()%n+1;
                y=rnd()%n+1;
            }
            ll cha=abs(a[x]-a[y]);
            for(int j=1;1ll*prime[j]*prime[j]<=cha&&j<=cnt;j++){
                if(cha%prime[j]==0){
                    ans=max(ans,cal(prime[j],a[x]%prime[j]));
                    while(cha%prime[j]==0){
                        cha=cha/prime[j];
                    }
                }
            }
            if(cha!=1) ans=max(ans,cal(cha,a[x]%cha));
        }
        printf("%d\n",ans);
    }
    return 0;
}


posted @ 2021-08-18 10:40  hunxuewangzi  阅读(96)  评论(0编辑  收藏  举报