一、基础算术定理
1.对一些定理的相关理解
(1)每个数n都能被分解为: n = P 1 a 1 ⋅ P 2 a 2 ⋅ P 3 a 3 . . . . . . . P n a n n=P{_1}{^{a_1}}\cdot P{_2}{^{a_2}}\cdot P{_3}{^{a_3}}.......P{_n}{^{a_n}} n=P1a1⋅P2a2⋅P3a3.......Pnan(p为素数)
1.通过另外一种形式:
n
=
P
1
⋅
P
1
a
1
−
1
⋅
P
2
a
2
⋅
P
3
a
3
.
.
.
.
.
.
.
P
n
a
n
n=P{_1}\cdot P{_1}{^{a_1-1}}\cdot P{_2}{^{a_2}}\cdot P{_3}{^{a_3}}.......P{_n}{^{a_n}}
n=P1⋅P1a1−1⋅P2a2⋅P3a3.......Pnan 我们能够知道n能被其中一个素数整除,并且能知道多少次方
2.结合(1)可以解出正因数个数:
s
u
m
=
(
1
+
a
1
)
×
(
1
+
a
2
)
×
(
1
+
a
3
)
…
…
×
(
1
+
a
n
)
sum=(1+a_1)\times (1+a_2)\times (1+a_3)……\times(1+an)
sum=(1+a1)×(1+a2)×(1+a3)……×(1+an)
运用1,2我们可以解决很棘手的问题,但值得注意的是1是正因数但并非素数. 在某些问题上需要sum * (1 + 1)
例题
题解
2.搬运
二、JAVA暴力
三、同余定理
四、快速幂
#include<iostream>
using namespace std;
long long ksm(long long a , long long b , long long mod){
long long res = 1 , base = a;
while(b){
if(b&1)
{
res = res * base % mod;
}
base *= base % mod;
b >>= 1;
}
return res;
}
int main(){
cout << ksm(2,3,100);
}