a≡ b(mod d)a和b是模d同余的。

一.

有定理:如果a≡x(mod d),b≡m(mod d),则a*b≡x*m (mod d )

下面来说说该定理的应用,我们知道一个数的各个位数之和如果能被3整除那么这个数也能被3整除,如12,因为1+2=3能被3整除,所以12也能被3整除。如果我们利用定律6,就可以找出任何一个数能被另一个数整除的表达式来。
如我们用11来试试,11可以表示为10+1,所以有同余式:

10≡-1 (mod 11)
把上式两边都乘以各自,即:

我们可以发现,任何一个(在十进制系统中表示的)整数,如果它的数码交替到变号之和能被11整除,这个数就能被11整除,如1353这个数它的数码交替变号之和为:1+(-3)+5+(-3)=0,因为0能被11整除,所以1353也能被11整除。

其他的数的找法也一样,都是两边都乘以各自的数,然后找出右边的数的循环数列即可。

二.

对于同一个除数,如果两个整数同余,那么他们的差就一定能被这个数整除。

==============================================

举个栗子:

现在给你一个自然数n,它的位数小于等于一百万,现在你要做的就是求出这个数除10003之后的余数。

思路:

同余定理:(a+b)%c=((a%c)+(b%c))%c

m%n举例:

123 % n = (((1%n10%n+2%n)%n10%n)%n+3%n)%n

关键:

gets(a);
len=strlen(a);
for(i=0;i<len;i++)
num=(num*10+(int)a[i]-'0')%10003;

============================================

自己写的被7整除的栗子:

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int main()
{
    int m,i,len,num,sum,j;
    char a[10000];
    gets(a);
    len=strlen(a);
    sum=0;
    for(i=0;i<len;i++)
    {
        num=a[i]-'0';
        for(j=0;j<len-1-i;j++)
            num=(num*3)%7;
        sum=(sum+num)%7;
    }
    if(sum==0)printf("yes\n");
}

(利用3≡10%7)


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

一些函数 Previous
三点顺序---有向面积 Next