• [HDU7073] Integers Have Friends 2.0 -随机大法好


    在这里插入图片描述
    output

    2
    3
    4
    

    题意:
    找到最大的一个集合,使得集合内所有元素 % m(>=2)
    问最大的集合大小

    对于第一组来讲:
    可以选择m == 2 or 3
    对于第二组来讲:
    可以选择m == 5

    在我们取m == 2的情况下,答案为 ⌈ n 2 ⌉ lceil frac{n}{2} ceil 2n

    选择两个位置,这两个数的位置均在答案中的可能性至少为 1 4 frac{1}{4} 41,反之可能性为 3 4 frac{3}{4} 43
    假如重复取30次,则:
    在这里插入图片描述
    可以看作为0
    所以方法是可靠的
    选定了两个位置p1,p2之后,m可以取diff = abs(a[p1]-a[p2])的质因子
    我们枚举diff的因子来当m进行操作,过程中一直取max即可

    Code:

    ll n,a[maxn];
    ll cal(ll x,ll y) {
    	ll ret = 0;
    	for(int i=1; i<=n; i++) {
    		if(a[i] % x == y) ret ++;
    	}
    	return ret;
    }
    int main() {
    	srand(time(NULL));
    	int _ = read;
    	while(_ --) {
    		n = read;
    		for(int i=1; i<=n; i++) a[i] = read;
    		ll ans = 1;
    		for(int I = 1; I<=30; I++) {
    			int p1 = rand() % n + 1;
    			int p2 = rand() % n + 1;
    			if(p1 == p2) continue;
    			ll diff = abs(a[p1] - a[p2]);
    			for(ll i=2; 1LL * i * i <= diff; i ++) {
    				if(diff % i == 0) {
    					while(diff % i == 0) diff /= i;
    					ans = max(ans,cal(i,a[p1]%i));
    				}
    			}
    			if(diff > 1) ans = max(ans,cal(diff,a[p1] % diff));
    		}
    		printf("%lld
    ",ans);
    	}
    	return 0;
    }
    /**
    3
    3
    10 12 15
    4
    4 6 9 19
    6
    2 8 11 15 19 38
    
    **/
    
  • 相关阅读:
    必须克服的10种不良阅读习惯
    如何提升你的影响力
    爱情在线:拥抱变化的男女爱情!
    时间与生命
    女子最钟爱的五种男人
    社交常用表达:把人家的名字给忘了怎么办?
    最常用英语口头禅[推荐]
    中秋节的来历
    学会欣赏自己
    转帖]白领:4大行业通往高薪之路
  • 原文地址:https://www.cnblogs.com/PushyTao/p/15459810.html
Copyright © 2020-2023  润新知