寒假集训学习记录 1-19

  嗯,今天的更草率(懒狗实锤了)呜呜呜。水一个博客吧,就……

  那么今天的内容就是同余定理了,简单到不好意思写,,,

 

1.定理描述
给定一个正整数m(m > 1),如果两个整数 a 和 b 满足 a-b能够被 m 整除,即 (a-b)/m 得到一个整数,那么就称 a 与 b 对模m同余,记作:a ≡ b(mod m),读作 :a 与 b 对模 m同余。

显然有如下事实:

1)若 a ≡ 0(mod m),则 a | m;

2) a ≡ b(mod m)等价于分别用 m 去除 a 和 b ,余数相同。

2.基本性质
① 反身性:a ≡ a(mod m)

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

③传递性:a ≡ b(mod m),b ≡ c(mod m),则 a ≡ c(mod m)

④同余式相加: a ≡ b(mod m),c ≡ d(mod m),则 a ± c ≡ b ± d(mod m)

⑤同余式相乘:a ≡ b(mod m),c ≡ d(mod m),则 ac ≡ bd(mod m)

⑥线性运算:a ≡ b(mod m),c ≡ d(mod m),则 a ± c ≡ b ± d(mod m),a * c ≡ b * d(mod m)

⑦除法:ac ≡ bc(mod m),c ≠ 0,则 a ≡ b(mod m/gcd(c,m)),其中,gcd(c,m)表示 c 和 m 的最大公约数

特殊地,gcd(c,m) = 1时,则 a ≡ b(mod m) 

⑧幂运算:

如果a=b(modm),那么a^n=b^n(modm);

⑨ a ≡ b(mod m) ,n = m,则 a ≡ b(mod m)

⑩若a ≡ b (mod mi) (i=1,2…n) 则 a ≡ b (mod [m1,m2,…mn]) 其中[m1,m2,…mn]表示m1,m2,…mn的最小公倍数

3.定理应用
⑴同余定理的加法乘法应用
(a + b) % m = (a % m + b % m) % m

(a * b) % m = ((a % m) * (b % m)) % m

⑵高精度取模
高精度对单精度取模:一个高精度数对一个数取余,可以把高精度数看成各位数的权值与个位数乘积的和。

例如:1234 = ((1 * 10 +2)* 10 +3)* 10 + 4),对这个数进行取余运算就是上面基本加和乘的应用。

 1 #include<iostream>
 2 #include<string>
 3 using namespace std;
 4  
 5 int main()
 6 {
 7     string num;    //高精度数num用string类型表示
 8     int num2,i;    // 单精度数num2用整形表示 
 9     cin>>num>>num2;
10     int len = num.length();
11     int ans = 0;
12     for(i = 0;i < len;i++)
13     {
14         ans = (ans * 10 + num[i] - '0')% num2;
15     }
16     cout<<ans<<endl;
17     return 0;
18 }

  嗯,然后每天一句,我是小废物。(小废物也实锤),加油|!

posted @ 2021-01-19 23:37  臭小鬼zm  阅读(50)  评论(0编辑  收藏  举报