蓝桥杯数论基础知识Java代码

文章介绍了使用Java编写的欧几里得算法求最大公约数、线性筛法求质数,以及约数个数和和的计算方法。同时涵盖了裴蜀定理和扩展欧几里得算法,以及数学中的相关知识点如互质数和一笔画问题的理论基础。
摘要由CSDN通过智能技术生成

数论

欧几里得算法求最大公约数

import java.util.*;
public class Main
{
    public static void main(String[] args)
    {
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        int b = sc.nextInt();
        System.out.print(gcd(a, b));
    }
    public static int gcd(int a, int b)
    {
        return b != 0 ? gcd(b, a % b) : a;
    }
}

线性筛法求质数

import java.util.*;
public class Main
{
    public static int N = 1000000;
    public static int[] primes = new int[N];  //记录素数
    public static boolean[] st = new boolean[N];  //有没有被筛过
    public static int[] minp = new int[N];  //最小质因子
    public static void main(String[] args)
    {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        
        get_primes(n);
        for (int i = 0; i <= n; i ++ )
        {
            if(primes[i] == 0)
                break;
            System.out.print(primes[i] + " ");
        }
    }
    public static void get_primes(int n)  //O(n)
    {
        int cnt = 0;
        for (int i = 2; i <= n; i ++ )
        {
            if (!st[i])
            {
                minp[i] = i;
                primes[cnt ++ ] = i;
            }
            for (int j = 0; primes[j] * i <= n; j ++ )
            {
                st[primes[j] * i] = true;
                minp[primes[j] * i] = primes[j];
                if(i % primes[j] == 0)  break;
            }
        }
    }
}

约数个数与和

N = p 1 α 1 ⋅ p 2 α 2 ⋅ ⋅ ⋅ p k α k N=p_1^{\alpha_1}·p_2^{\alpha_2}···p_k^{\alpha_k} N=p1α1p2α2⋅⋅⋅pkαk
约数个数: ( α 1 + 1 ) ( α 2 + 1 ) ⋅ ⋅ ⋅ ( α k + 1 ) (\alpha_1+1)(\alpha_2+1)···(\alpha_k+1) (α1+1)(α2+1)⋅⋅⋅(αk+1)
约数之和: ( 1 + p 1 + p 1 2 + ⋅ ⋅ ⋅ + p 1 α 1 ) ( 1 + p 2 + p 2 2 + ⋅ ⋅ ⋅ + p 2 α 2 ) ⋅ ⋅ ⋅ ( 1 + p k + p k 2 + ⋅ ⋅ ⋅ + p k α k ) (1+p_1+p_1^2+···+p_1^{\alpha_1})(1+p_2+p_2^2+···+p_2^{\alpha_2})···(1+p_k+p_k^2+···+p_k^{\alpha_k}) (1+p1+p12+⋅⋅⋅+p1α1)(1+p2+p22+⋅⋅⋅+p2α2)⋅⋅⋅(1+pk+pk2+⋅⋅⋅+pkαk)

裴蜀定理

a x + b y = g c d ( a , b ) ax+by=gcd(a,b) ax+by=gcd(a,b)
扩展欧几里得算法

import java.util.*;
public class Main
{
    public static void main(String[] args)
    {
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        int b = sc.nextInt();
        int[] x = new int[1];
        int[] y = new int[1];
        
        int d = exgcd(a, b, x, y);
        System.out.println(a + " * " + x[0] + " + " + b + " * " + y[0] + " = " + d);
    }
    public static int exgcd(int a, int b, int[] x, int[] y)
    {
        if (b == 0)
        {
            x[0] = 1;
            y[0] = 0;
            return a;
        }
        int d = exgcd(b, a % b, y, x);
        y[0] -= (a / b) * x[0];
        return d;
    }
}

其他数学知识

  1. 如果 a , b a,b a,b,均是正整数且互质,那么由 a x + b y ( x ≥ 0 , y ≥ 0 ) ax+by(x≥0,y≥0) ax+by(x0,y0) 不能凑出的最大数是 a b − a − b . ab−a−b. abab.
    也即 a a a b b b 的最大公因数 ( a , b ) = 1 (a,b)=1 (a,b)=1,最大不能凑出来的数是 ( a − 1 ) ( b − 1 ) − 1 (a-1)(b-1)-1 (a1)(b1)1
  2. 某图当且仅当只有两个或零个奇数点时能够一笔画画完,最少需要 ( n + 1 ) / 2 (n+1)/2 (n+1)/2 的下取整笔画, n n n 为奇数点数
  3. C n m = C n − 1 m + C n − 1 m − 1 C_n^m = C_{n-1}^m + C_{n-1}^{m-1} Cnm=Cn1m+Cn1m1
  • 40
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值