目录
同模余定理
定义所谓的同余,顾名思义,就是许多的数被一个数 d 去除,有相同的余数。d 数学上的称谓为模。
如 a = 6, b = 1, d = 5, 则我们说 a 和 b 是模 d 同余的。因为他们都有相同的余数 1 。
数学上的记法为: a≡ b(mod d) 可以看出当 n < d 的时候,所有的 n 都对 d 同商,比如时钟上的小时数,都小于 12, 所以小时数都是模 12 的同余.对于同余有三种说法都是等价的,分别为:
(1) a 和 b 是模 d 同余的.
(2) 存在某个整数 n ,使得 a = b + nd .
(3) d 整除 a - b .
可以通过换算得出上面三个说话都是正确而且是等价的,同余公式也有许多我们常见的定律,比如相等律,结合律,交换律,传递律….如下面的 表示:
1) a≡a(mod d)
2) a≡b(mod d)→b≡a(mod d)
3) (a≡b(mod d),b≡c(mod d))→a≡c(mod d) 如果 a≡x(mod d),b≡m(mod d),则
4) a+b≡x+m (mod d)
5) a-b≡x-m(mod d)
6) a*b≡x*m(mod d )
应用
(a+b)%c=(a%c+b%c)%c;
(a-b)%c=(a%c-b%c)%c;
(a*b)%c=(a%c*b%c)%c
同余模定理的运算不适用于除法
题1-求S(n)
题目描述
S(n)=n^5 求S(n)除以3的余数
输入描述:
每行输入一个整数n,(0 < n < 1000000) 处理到文件结束
输出描述:
输出S(n)%3的结果并换行
输入样例#:
1 2
输出样例#:
1 2
- n 虽然不大,但是 n^5 却超过 long long 的范围,所幸的 是题目只要我们对答案%3,这时候我们就可以运用同余模定理。 S(n)%3=(n^5)%3=(n*n*n*n*n)%3=((n%3)*(n%3)*(n%3)*(n%3)*(n%3))%3
#include<stdio.h>
#include <bits/stdc++.h>//万能头文件
using namespace std;
int n;
int main(){
//(n*n)%3==((n%3)*(n%3))%3
while(scanf("%d",&n)!=EOF){
int res = n%3;
for(int i = 1;i<5;i++){//for循环中再* n%3四次
res = res*n%3;
}
cout<<res%3<<endl;
}
return 0;
}
最大公约数(GCD)
辗转相除法
-
辗转相除法是求两个自然数的最大公约数的一种方法,也叫欧几里德算法。
-
用较大数除以较小数,再用出现的余数去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。最后为0,则除数为最大公约数。
-
依然是求18和30 的最大公约数,方法如图所示。

#include<stdio.h>
#include <bits/stdc++.h>//万能头文件
using namespace std;
int gcd(int a,i

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



