一、学习内容
这周学的都是原理方面的知识,平时用到的只是表面,现在深入学习下。
(接上此总结)
1、因子个数
朴素的求因子个数的方法为枚举[1, n]的数进行余数判定,复杂度为O(n)
加入一个小优化:如果m为n的因子,那么n/m也必然为n的因子;
设m <= n/m,则有m <= sqrt(n),
只要枚举从[1, sqrt(n)]的因子然后计数即可,复杂度变为O(sqrt(n))。
2、整数惟一分解定理的推论
-
若整数𝑁≥2,那么 𝑁= p 1 r 1 p_1^{r_1} p1r1 p 2 r 2 p_2^{r_2 } p2r2 … p k r k p_k^{r_k} pkrk p i p_i pi 为素数 , r i r_i ri≥0)
-
𝑁 的正约数集合为:{ p 1 b 1 p_1^{b_1} p1b1 p 2 b 2 p_2^{b_2 } p2b2 … p k b k p_k^{b_k} pkbk }(0 ≤ b i b_i bi ≤ r i r_i ri )
-
𝑁 的正约数个数为:
-
除了完全平方数,约数总是成对出现的,即 d ≤ N \sqrt{N} N 和 N d \frac{N}{d} dN ≤ N \sqrt{N} N 都是 𝑁 的约数。
-
𝑁 的约数个数上界为 2 N \sqrt{N} N ,时间复杂度为 𝑂( N \sqrt{N} N) 。
-
𝑁 的所有正约数的和为:
3、计算gcd(𝑎,𝑏):适用于高精度数的二进制法
适合大整数(高精度)情况下求gcd
- 𝑎<𝑏时,gcd(𝑎,𝑏)=gcd(𝑏,𝑎)
- 𝑎=𝑏时,gcd(𝑎,𝑏)=𝑎
- 𝑎,𝑏 同为偶数时,gcd(𝑎,𝑏)=2∗gcd(𝑎/2,𝑏/2)
- 𝑎 为偶数,𝑏 为奇数时,gcd(𝑎,𝑏)=gcd(𝑎/2,𝑏)
- 𝑎 为奇数,𝑏 为偶数时,gcd(𝑎,𝑏)=gcd(𝑎,𝑏/2)
- 𝑎,𝑏 同为奇数时,gcd(𝑎,𝑏)=gcd(𝑎−𝑏,𝑏)
又称“更相减损术”。
【代码】
int gcd(int m,int n){
if (m == n) return m;
if (m < n) return gcd(n,m);
if (m & 1 == 0)
return (n & 1 == 0)? 2*gcd(m>>1,n>>1):gcd(m>>1,n);
return (n & 1 == 0)? gcd(m,n>>1): gcd(n,m-n);
}
4、lcm(最小公倍数)
𝑎 和 𝑏 最小的正公倍数为 𝑎 和 𝑏 的最小公倍数,记作 lcm(𝑎,𝑏) 。
最小公倍数有如下性质:
lcm(𝑎,𝑏)=𝑎𝑏/(gcd(𝑎,𝑏))
若 𝑎|𝑚 且 𝑏|𝑚,则 lcm(𝑎,𝑏)|𝑚
若 𝑚,𝑎,𝑏 是正整数,则 lcm(𝑚𝑎,𝑚𝑏)=𝑚∗lcm(𝑎,𝑏) 。
5、模
a = int(a/p)*p + a%p;
随时取模性质:
- 在只含加法和乘法的式子中,如果最后的运算结果需要对𝑝取模,那么您可以在运算过程中随便取模。
- 只需要最后把结果对𝑝再取模,答案就是正确的。
- 正整数𝑛被3整除,当且仅当十进制下𝑛的各位数字之和被3整除。例如,123被3整除,1+2+3=6也被3整除。
- 𝑛被4整除当且仅当其最后两位数被4整除。
快速幂
int pow_mod(int a,int n,int m){
if(n == 0) return 1;
int x = pow_mod(a,n/2,m);
long long ans = (long long)x * x % m;
if(n % 2 == 1)
ans = ans * a % m;
return ans;
}
5、一些定理
1.费马小定理:若p为素数,且a和p互素,那么
a
p
−
1
a^{p-1}
ap−1 ≡ 1(mod p)
2.欧拉定理: 在p不是素数的时候,对于和m互素的a,有:
a
f
(
m
)
a^{f(m)}
af(m) ≡ 1(mod m);
3.裴蜀定理:对于任何a,b 关于未知数x y的线性不定方程ax+by=c;当 a,b互素等价于ax+by=1有解
剩下的等下周学完把所有的一起整理一下吧。
总结以及感想
数论这一块的题没怎么做,大概是思维方向,代码容易一些,但是思维深一点吧,具体做了再具体分析。
不得不说的是这周cf真的多,多到题目还没来得及补题
前些天div3的ac了3道题还扣分了,上上上场div2ac了一道题结果加分了,有点难……div3那场分数又创新低,不过最近这两场应该能把分数网上拉一下,感觉做的勉强还行吧,div2的比赛永远两题魔咒。
感觉高中的数学知识全都还给高中老师了,最近那场div2的比赛C题用到的公式全都忘记了,虽然百度搜公式也没找到思路,感觉数学再div2div3里面大行其道,算法用的不算多,近期用到了dp还有前缀和(竟然能用上了!),感觉还不错,自从有次分数回到1200又跌下来之后,渐渐有点状态了,以后继续加油吧,还有几周时间,希望18周前能到1400吧(希望……),加油加油。