Yet Another mod M

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

题目传送门

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

解法

如果有答案,我们随机一个数 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");
}
先展示下效果 https://pan.quark.cn/s/a4b39357ea24 遗传算法 - 简书 遗传算法的理论是根据达尔文进化论而设计出来的算法: 人类是朝着好的方向(最优解)进化,进化过程中,会自动选择优良基因,淘汰劣等基因。 遗传算法(英语:genetic algorithm (GA) )是计算数学中用于解决最佳化的搜索算法,是进化算法的一种。 进化算法最初是借鉴了进化生物学中的一些现象而发展起来的,这些现象包括遗传、突变、自然选择、杂交等。 搜索算法的共同特征为: 首先组成一组候选解 依据某些适应性条件测算这些候选解的适应度 根据适应度保留某些候选解,放弃其他候选解 对保留的候选解进行某些操作,生成新的候选解 遗传算法流程 遗传算法的一般步骤 my_fitness函数 评估每条染色体所对应个体的适应度 升序排列适应度评估值,选出 前 parent_number 个 个体作为 待选 parent 种群(适应度函数的值越小越好) 从 待选 parent 种群 中随机选择 2 个个体作为父方和母方。 抽取父母双方的染色体,进行交叉,产生 2 个子代。 (交叉概率) 对子代(parent + 生成的 child)的染色体进行变异。 (变异概率) 重复3,4,5步骤,直到新种群(parentnumber + childnumber)的产生。 循环以上步骤直至找到满意的解。 名词解释 交叉概率:两个个体进行交配的概率。 例如,交配概率为0.8,则80%的“夫妻”会生育后代。 变异概率:所有的基因中发生变异的占总体的比例。 GA函数 适应度函数 适应度函数由解决的问题决定。 举一个平方和的例子。 简单的平方和问题 求函数的最小值,其中每个变量的取值区间都是 [-1, ...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值