本人是刚学算法的萌新,还请大佬们指正。
这篇文章主要是介绍质数,约数,欧拉函数,快速幂,扩展欧几里得算法,中国剩余定理,高斯消元,求组合数,容斥原理,博弈论的相关内容。
现在还在完善ing,之后会补上一些例题
1.质数
1.1质数的判定(试除法) O(sqrt(n))
质数的定义:该数的因子只有1和本身。
输入一个数判断它是否是质数
bool isprime(int n){
if(n<2) return false;
for(int i=2;i<=n/i;i++){
if(n%i==0) return false;
}
return true;
}
1.2分解质因数(试除法) O(sqrt(n))
(其中p1~pk均为质数)
题意:输入n,每行输出
思路:由于不存在一个数有两个>sqrt(n)的质因子(反证法:若n能分解成两个>sqrt(n)的质因子,则这两个质因子的乘积必然>n),所以只需枚举2~sqrt(n)判断该数的质因子,若i是n的质因子,则一直n/=i,直到n%i!=0次数就是。需要注意的是我们是枚举2~sqrt(n)如果n最后不等于1,那么n就是最后一个>sqrt(n)的质因子。代码如下:
void divide(int n) {
for(int i=2; i<=n/i; i++) {
if(n%i==0) { //这里i绝对为质数
int s=0;
while(n%i==0) {
n/=i;
s++;
}
printf("%d %d\n",i,s);
}