同余模是数论中一个基本的运算规则;
同余模:a≡ b(mod d)
解释:a对d取模等于b对d取模
基本定律:
同余公式也有许多我们常见的定律,比如相等律,结合律,交换律,传递律….如下面的表示:
1)传递性 (a≡b(mod d),b≡c(mod d))→a≡c(mod d)
如果a≡x(mod d),b≡m(mod d),则
2)a+b≡x+m (mod d)
3)a-b≡x-m (mod d)
4)a*b≡x*m (mod d )
5)a/b≡x/m (mod d)
6)a≡b(mod d)则a-b整除d
7)a≡b(mod d)则a^n≡b^n(mod d)
8)如果ac≡bc(mod m),且c和m互质,则a≡b(mod m)
模运算的基本规则:
1. 加法 (a + b) mod p = (a mod p + b mod p) mod p;
2. 减法 (a - b) mod p = (a mod p - b mod p) mod p;
3. 乘法 (a * b) mod p = (a mod p * b mod p) mod p;
4. 幂运算 a^b mod p = ((a mod p)^b) mod p; //可使用快速幂取模
5. 结合率 ((a+b) mod p + c) mod p = (a + (b+c) mod p) mod p;
((a*b) mod p * c) mod p = (a * (b*c) mod p) mod p;
6. 交换率 (a + b) mod p = (b+a) mod p;
(a * b) mod p = (b * a) mod p ;
7. 分配率 ((a +b) mod p * c) mod p = ((a * c) mod p + (b * c) mod p) mod p;
扩展取模运算:大数取模运算
例如:现在给你一个自然数n,它的位数小于等于一百万,现在你要做的就是求出这个数除10003之后的余数。
此时就要用到 加法和乘法的同余思想 了
为什么呢?给你一个比较大的数例如 12345
则 12345%mod =(((((((1*10%mod + 2)%mod)*10+3)%mod)*10+4)%mod)+5)%mod;
则 x1x2x3x4x5....%mod = (((((((x1*10%mod + x2)%mod)*10+x3)%mod)*10+x4)%mod)+x5)%mod ....;
当然还有一种思路就是幂运算取模和快速幂的思想了:
x1x2x3x4x5....%mod = x1*10^(n-1)%mod + x2*10^(n-2)%mod + x3*10^(n-3)%mod + x4*10^(n-4)%mod + x5*10^(n-5)%mod ....;
n表示数的长度,^ 表示幂; 但是我写了过了案例,但没能过OJ,等我想通了再改!!!
代码:
#include
#include
#include
#include
using namespace std;
const int maxn = 10000005;
#define mod 10003
char s[maxn];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(s,0,sizeof(s));
scanf("%s",s);
int ans = 0;
int len = strlen(s);
for(int i = 0; i < len ; i++)
ans = (ans*10+(s[i]-'0') )%mod;
printf("%d
",ans%mod);
}
return 0;
}