Yet Another mod M

本文介绍了一种利用随机化策略解决绝对值差的模分解问题的算法,通过多次随机选择元素,提高找到质因数的概率,从而降低时间复杂度。代码展示了如何实现这一过程,目标是寻找两个数差的质因数,如果符合条件则输出质因数,否则返回-1。
摘要由CSDN通过智能技术生成

题目传送门

总结一下, 绝对众数 = 随机化 绝对众数=随机化 绝对众数=随机化 ,虽然这么说有点套路,但还是多这么想想

解法

如果有答案,我们随机一个数 a i a_i ai , 那么 a i a_i ai 满足 a i = x ( m o d M ) a_i =x \quad(mod \quad M) ai=x(modM) 的概率大于 50 % 50\% 50% , 所以我们随机 20 20 20 及以上次 a i a_i ai ,再随机一个 a j a_j aj 也满足条件,那么 M ∣ ( ∣ a i − a j ∣ ) M\quad|\quad(|a_i-a_j|) M(aiaj) ,对 ∣ a i − a j ∣ |a_i-a_j| aiaj 进行质因子分解即可
时间复杂度 O ( T 2 n log ⁡ n ) O(T^2n \log{n}) O(T2nlogn) , T T T 为随机的次数

Code

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
const int N=5e3+7;

int n;
int a[N];

int main(){
    srand(10086001);
    scanf("%d",&n);
    for(int i=1;i<=n;i++) {
        scanf("%d",&a[i]);
    }
    for(int _=1;_<=52;_++) {
        int i=(rand()%n)+1;
        for(int j=1;j<=40;j++) {
            int k=(rand()%n)+1;
            int res=abs(a[i]-a[k]);
            for(int t=3;t*t<=res;t++) {
                if(res%t==0) {
                    while(res%t==0) res/=t;
                    int cnt=0;
                    if(t<=2) continue;
                    for(int l=1;l<=n;l++) {
                        if(a[l]%t==a[i]%t) {
                            cnt++;
                            if(cnt*2>n) break;
                        } 
                    }
                    if(cnt*2>n) return printf("%d\n",t),0;
                }
            }
            if(res>2) {
                int cnt=0;
                for(int l=1;l<=n;l++) {
                    if(a[l]%res==a[i]%res) {
                        cnt++;
                        if(cnt*2>n) break;
                    } 
                }
                if(cnt*2>n) return printf("%d\n",res),0;
            } 
        }
    }
    puts("-1");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值