基础数论(入门)

基础数论(入门,貌似还没)

嫖了学长的pdf

常用运算符

在这里插入图片描述

基本常识(就很…)

在这里插入图片描述

基本定理(最好有些简单题来把基本定理练熟)

在这里插入图片描述

常用算法

埃氏筛
从整数中筛去合数,留下素数
考虑给定一个素数x那么很明显所有x的倍数都不是素数,我们只需要枚举一个系数i,将所有的xi标记为合数即可
复杂度参考前面的常识~O(n log log n)

for(int i=2;i<maxn;++i) { 
	for(int j=i;j<maxn;j+=i) { 
		notPrime[j]=1; 
	} 
}

一点点小优化,可以发现对于所有j<i^2, 一定在之前已经被筛掉l了
所以可从i^2开始筛
线性筛
大部分只需要判断素数的问题,埃氏筛已经够优秀了
但是一部分题需要更大的素数范围或需要快速求一些积性函数的问题,此时需要用到线性筛
反正我学会线性筛就再没用过埃氏筛
我们发现埃氏筛在筛的过程中,同一个数字会被筛去很多次,正是这一步限制了它的效率
线性筛的优化在于每个数字只会被它的最小素因子筛去,每个数字只会被筛去一次
具体做法:假设当前枚举到整数i,枚举当前所有小于等于i的素数记作pj,若i不是pj的倍数,将ipj筛去,此时pj是整数ipj的最小素因子
因为每个数只会被它的最小素因子筛去,复杂度~O(n)

for(int i=2;i<maxn;++i) { 
	if(!notPrime[i]) { 
		prime[tot++] = i; 
	}
	for(int j=0;j<tot&&i*prime[j]<maxn;++j) { 
		notPrime[i*prime[j]]=1; 
		if(i%prime[j]==0) 
			break; 
	} 
}

用线性筛求积性函数
在这里插入图片描述

    for (int i = 2;i < maxn;++i) {
        if (!notPrime[i]) {
            prime[tot++] =i;
            f[i] =func();
            g[i] = f[i];
        }
        for (int j = 0;j < tot && i * prime[j] <maxn;++j) {
            notPrime[i * prime[j]] = 1;
            if (i % prime[j] == 0) {
                int ret = 1, x = i;
                while (x % prime[j] == 0) {
                    ret *= prime[j];
                    x /= prime[j];
                }
                f[i * prime[j]] = f[i] / g[i] * f[ret];
                g[i * prime[j]] = f[ret];
                break;
            }
            f[i * prime[j]] = f[i] * f[prime[j]];
            g[i * prime[j]] = f[prime[j]];
        }
    }

一般来说这些函数都会有一些方便计算的性质,中间求ret的部分可以被极大的简化
快速幂
在这里插入图片描述

	int quickpow(int a, int n, int mod) {
        int ans = 1;
        while (n) {
            if (n & 1) ans = ans * a % mod;
            a = a * a % mod;
            n >>= 1;
        }
        return ans;
    }

矩阵快速幂
在这里插入图片描述
辗转相除法/欧几里得算法
在这里插入图片描述

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

在这里插入图片描述
扩展欧几里得
在这里插入图片描述

int exgcd(int a, int b, int &x, int &y) {
        if (b == 0) {
            x = 1, y = 0;
            return a;
        }
        int d = exgcd(b, a % b, x, y);
        int tmp = x;
        x = y;
        y = tmp - y * (a / b);
        return d;
    }

在这里插入图片描述
中国剩余定理
在这里插入图片描述
gcd性质
1、结合律,gcd(a,b,c)=gcd(a,gcd(b,c))=gcd(gcd(a,b),c)
2、gcd(a,b)=gcd(b,a/b)=gcd(b,∣a−b∣)=gcd(a,∣a−b∣)

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值