Atcoder abc272
https://atcoder.jp/contests/abc272/tasks
G - Yet Another mod M
给长n数列A, distinct( ai != aj)
问是否存在 m \in [3,1e9]
使得 a[i]=a[i]%m 后,
有一半以上的数为某个x,(存在x使得x的个数 > 非x的个数)
范围
n 5000
ai 1e9
2s
1024mb
我的思路
感觉又是数论什么的, 不过这个n 5000 不知道是有什么n^2的说法吗
首先假设 能有x(m) 满足
显然 若p为m的因子
那么 这些 xi%m == x(m) 的 对应 xi%p = (xi%m)%p = x(m) %p 依然满足
所以只用考虑 质数 和 2 * 质数
, 又因为2*质数
如果合法,则质数
合法, 当为2^幂次时, 校验4即可
所以 只用考虑 质数
如果本来就有数字次数大于一半, 那么随便取
否则必定会让原来不等的两个数相等
考虑两个不等的数 ai,aj
ai % m == aj % m
(ai-aj) %m = 0
所以枚举质因子
但这样是 n^2 sqrt(ai) n
感觉并过不了? 上质因子拆解模版?
还是先收集完(ai-aj)
然后同时进行质因数查找
关键验证还需要n
(ai-aj)%m == 0 等价与 它们mod m后相等
换句话说, 收集ai-aj 后
如果 有t > n/2个值相等
那么两两成边 t(t-1)/2 条边, 即 ai-aj 需要 >= t(t-1)/2
这样的话 直接在收集后 的ai-aj 中枚举m????(O(max(ai/2)))
不会