AC算法社 寒假集训四

基础数学知识

这里讲一些最基础的数学知识,基本上都是一些题目的前置知识,你可以不用,但不能不会
题目集:vj地址

质数

什么是质数(素数)?
质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数(规定1既不是质数也不是合数)

判断质数几种方法

问题: 求出 1∼n中质数的个数

1.暴力求解(n*√n)

int isPrime(int x){
	for(int i=2;i*i<=x;++i){
		if(x%i==0) return 0;
	}
	return 1;
}

2.诶氏筛法 O(nloglogn)

void getPrime(){
    for(int i=2;i<=n;i++){
        if(!st[i]){
            primes[cnt++]=i;
            for(int j=i;j<=n;j+=i) st[j]=true;//可以用质数就把所有的合数都筛掉;
        }
    }
}

3.线性筛法 O(n)

核心思想:
注意这个算法一直使用“某数×质数”去筛合数,又已经证明一个合数一定会被它的最小质因数 p 1 p_1 p1筛掉,所以我们唯一要担心的就是同一个合数是否会被“另外某数 × p 1 p_1 p1以外的质数”再筛一次导致浪费时间。
代码中,外层枚举 i = 1→n。对于一个 i,经过前面的腥风血雨,如果它还没有被筛掉,就加到质数数组 Prime[]中。下一步,是用 i 来筛掉一波数。
内层从小到大枚举 Prime[j]。i×Prime[j] 是尝试筛掉的某个合数,其中,我们期望 Prime[j]是这个合数的最小质因数 (这是线性复杂度的条件,下面叫做“筛条件”)。它是怎么得到保证的?

j 的循环中,有一句就做到了这一点:

if(i % Prime[j] == 0) break; 

完整代码:

int primes[N], cnt;     // 记录得到的素数 
bool st[N];             // 标记元素是否被筛掉
void get_primes(){
    //外层从2~n迭代,因为这毕竟算的是1~n中质数的个数,而不是某个数是不是质数的判定
    for(int i=2;i<=n;i++){
        if(!st[i]) primes[cnt++]=i;
        for(int j=1;j<=cnt&&primes[j]*i<=n;j++){//primes[j]*i<=n,把大于n的合数都筛了就
        //没啥意义了
            st[primes[j]*i]=true;//用最小质因子去筛合数
            //1)当i%primes[j]!=0时,说明此时遍历到的primes[j]不是i的质因子,那么只可能是此时的primes[j]<i的
            //最小质因子,所以primes[j]*i的最小质因子就是primes[j];
            //2)当有i%primes[j]==0时,说明i的最小质因子是primes[j],因此primes[j]*i的最小质因子也就应该是
            //prime[j],之后接着用st[primes[j+1]*i]=true去筛合数时,就不是用最小质因子去更新了,因为i有最小
            //质因子primes[j]<primes[j+1],此时的primes[j+1]不是primes[j+1]*i的最小质因子,此时就应该
            //退出循环,避免之后重复进行筛选。
            if(i%primes[j]==0) break;
        }
    }

}

约数

对于两个数a,b

最大公约数(即 gcd):
辗转相除法:两数相除,取余数重复进行相除,直到余数为0时,前一个除数即为最大公约数。

int gcd(int a,int b) 
{    
    return b>0 ? gcd(b,a%b):a;
}

最小公倍数(即 lcm):
lcm

lcm(a,b)=a*b/gcd(a,b);

**

快速幂

**

讲解博客地址

long long fastPower(long long base, long long power) {
    long long result = 1;
    while (power > 0) {
        if (power & 1) result = result * base % mod;
        power >>= 1;//此处等价于power=power/2
        base = (base * base) % mod;
    }
    return result;
}

求组合数

递推式:
在这里插入图片描述

const int mod = 1e9+7;
long long f[2010][2010];
for(int i=0;i<=2000;i++)
    {
        for(int j=0;j<=i;j++)
        {
            if(!j) f[i][j]=1;
            else f[i][j]=(f[i-1][j-1]+f[i-1][j])%mod;
        }
    }

太小了,只能算千位

乘法逆元:
在这里插入图片描述
“取模”运算的运算法则:(具体的证明感兴趣的同学可以问度娘)

(a + b) % p = (a % p + b % p) % p (1)

(a - b) % p = (a % p - b % p ) % p (2)

(a * b) % p = (a % p * b % p) % p (3)

( a ÷ b ) % c= ( a % c ÷ b % c)% c --> 错的

想边乘边除边取模肯定是不可取的,
这时候就要用到著名的费马小定理了:
fm
也就是说:a的逆元为a^(p-2)
直接用上面讲述的快速幂即可

简单博弈论

题目常以两人玩回合制游戏为背景,每轮都采取最优解,老熟人Alice和Bob。
Nim游戏 ----------题解链接
台阶-Nim游戏
集合-Nim游戏
拆分-Nim游戏

这里放一张Acwing基础课的知识点图,还是非常好的,对于算法小白把能用到的数学基本上都列举了,没买课的照着知识点学就行了
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
LMEDS(Least Median of Squares)算法和MSAC(Maximum Sample Consensus)算法都是用于参数估计的鲁棒性算法,可以处理包含噪声和离群值的数据集。它们在处理离群值时有一些不同之处: 1. LMEDS算法:LMEDS算法是一种基于中值的方法,它通过最小化中值残差来估计模型参数。具体来说,它在每次迭代中随机选择一个样本集合,并计算数据点到模型的距离。然后通过排序距离并选择中值来评估模型的拟合程度。这个过程会迭代多次,直到找到具有最小中值残差的模型参数。 2. MSAC算法:MSAC算法是一种基于采样一致性的方法,它通过最大化内点数量来估计模型参数。具体来说,它在每次迭代中随机选择一个样本集合,并根据预定义的阈值确定哪些数据点是内点,哪些是外点。然后通过计算内点数量来评估模型的拟合程度。这个过程会迭代多次,直到找到具有最大内点数量的模型参数。 总的来说,LMEDS算法使用中值残差作为评估模型拟合程度的指标,而MSAC算法使用内点数量作为评估模型拟合程度的指标。两者的目标都是找到对数据集拟合最好的模型参数,但在处理离群值时的策略略有不同。LMEDS算法更适合于数据集中存在少量离群值的情况,而MSAC算法更适合于存在更多离群值的情况。选择使用哪种算法取决于具体数据集和问题的特点。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值