整除与同余

【整除】

1.定义

若 \exists q \in Z , s.t. b=a*q ,则称 b 被 a 整除,记作 a|b,其中,b 是 a 的倍数,a 是b 的约数。

2.性质

1)若 a|b 且 b|c,则:a|c

2)若 a|b 且 a|c,对于 \forall x,y \in Z,有:a|(b*x+c*y)

3)若 a|b 且 \exists m\neq 0,则:(m*a)|(m*b)

4)若 a|n 且 b|n,当 \exists x,y \in Z,满足:a*x+b*y=1 时,有:(a*b)|n

3.能被整除的整数的特征

1)0 与 1 的特性:对于任何整数a,总有:1|a;若 a≠0,则:a|0

2)能被 2 整除的数:整数的个位能被 2 整除

3)能被 4 整除的数:整数末尾的两位数能被 4 整除

4)能被 8 整除的数:整数末尾的三位数能被 8 整除

5)能被 3 整除的数:整数各位数字之和能被 3 整除

6)能被 6 整除的数:整数能被 2、3 同时整除

7)能被 9 整除的数:整数各位数字之和能被 9 整除

8)能被 5 整除的数:整数的末位是 0 或 5

9)能被 7 整除的数:截去整数的个位,再减去个位数的 2 倍,若差是 7 的倍数,则原数能被7整除。

注:若所得新数差太大或扔不易看出是否为 7 的倍数,需要继续上述「截尾、倍大、相减、验差」的过程,直到能判断为止

10) 能被 11 整除的数:整数的奇位和与偶位和的差能被 11 整除

【同余】

1.定义

若  \exists a,b \in Z,且 m|(a-b),则称 a 与 b 关于模 m 同余,记为:a \equiv b(mod m)

同余意味着 a-b=m*k,k \in Z,例如:32 \equiv 2(mod 5),此时 k=6

2.性质

1)基础性质

① 传递性:若 a \equiv b(mod m),b \equiv c(mod m),则:a \equiv c(mod m)

② 对称性:若 a \equiv b(mod m),则:b \equiv a(mod m)

③ 自反性: a \equiv a(mod m)

2)运算性质

① 同加性:若 a \equiv b(mod m),则:a+c \equiv b+c(mod m)

② 同幂性:若 a \equiv b(mod m),则:a^{^{n}} \equiv b^{^{n}}(mod m)

③ 同乘性:

     若 a \equiv b(mod m),则:a*c \equiv b*c(mod m)

     若 a \equiv b(mod m),c \equiv d(mod m),则:a*c \equiv b*d(mod m)

3)推论

① 若 a mod p=x,a mod q=x,且 p、q 互质,则 a mod p*q =x

② a*b mod k=(a mod k) *(b mod k) mod k

3.例题:指数取余

问题:输入 m,n,k 三个整数,求 m^{n} * k 的值

分析:以求 3^{89} mod\; 7 为例

3^{1}\equiv 3(mod\: \, 7)

3^{2}\equiv 3^{2}(mod\: \, 7)\equiv 2(mod\: \, 7)

3^{4}\equiv (3^{2})^{2}(mod\: \, 7)\equiv 4^{2}(mod\: \, 7)\equiv 2

3^{8}\equiv (3^{8})^{2}(mod\: \, 7)\equiv 2^{2}(mod\: \, 7)\equiv 4

3^{32}\equiv (3^{16})^{2}(mod\: \, 7)\equiv 4^{2}(mod\: \, 7)\equiv 2

3^{64}\equiv (3^{32})^{2}(mod\: \, 7)\equiv 2^{2}(mod\: \, 7)\equiv 4

3^{89}\equiv 3^{64}*3^{16}*3^{8}*3^{1}(mod\: \, 7)\equiv 4*4*2*3(mod\: \, 7)\equiv 96(mod\: \, 7)\equiv 5(mod\: \, 7)

因此,可递归的对 n 进行二进制分解,即快速幂运算,同时进行求模。

递归公式:

x^y=\left\{\begin{matrix}1,y=0 \\ x*x^{y-1},y=2*n+1 \\ (x^2)^{y/2},y=2*n \end{matrix}\right.

快速幂:https://blog.csdn.net/u011815404/article/details/80920908

源程序:

#include<iostream>
using namespace std;
int main()
{
    int m,n,k;
    int ans=1;
    cin>>m>>n>>k;
    while(n)
    {
        if(n&1)//若n为奇数
        {
            ans=ans*m;
            ans%=k;
        }
        n>>=1;//n除2
        m*=m;
        m%=k;
    }
    cout<<ans<<endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/u011815404/article/details/81280625