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;
}
不摆烂了,写题