Primes and factors素数和因子
Number of primes

One interesting class of prime:
试除法判断素数
bool is_prime(int x){if (x < 2) return false;for (int i = 2; i <= x / i; i++)if (x %i == 0) return false;return true;}
分解质因子
void divide(int x){for (int i = 2; i <= x / i; i++)if (x % i == 0){int s = 0; // 计数器,记录个数while (x % i == 0) x /= i, s++;cout << i << ' ' << s << endl;}if (x > 1) cout << x << ' ' << 1 << endl;puts("");}
唯一分解定理
朴素筛法O(nlogn)
void get_primes(int n){for (int i = 2; i <= n; i++){if (!st[i]){primes[cnt++] = i;}for (int j = i + i; j <= n; j += i) st[j] = true;}}

埃式筛法O(n) O(nloglogn)
void get_primes(int n){for (int i = 2; i <= n; i++){if (st[i]) continue;primes[cnt++] = i;for (int j = i + i; j <= n; j += i)st[j] = true;}}

线性筛 O(n)
// 核心:n只会被他的最小质因子筛掉void get_primes(int n){for (int i = 2; i <= n; i++){if (!st[i]) primes[cnt++] = i;for (int j = 0; primes[j] <= n / i; j++){st[primes[j] * i] = true;if (i % primes[j] == 0) break;}}}
约数个数

#include <iostream>#include <unordered_map>using namespace std;typedef long long LL;const int mod = 1e9 + 7;int main(){int n;cin >> n;unordered_map<int, int> primes;while (n--){int x;cin >> x;for (int i = 2; i <= x / i; i++)while (x % i == 0){x /= i;primes[i] ++;}if (x > 1) primes[x]++;}LL res = 1;unordered_map<int, int>::iterator it;for (it = primes.begin(); it != primes.end(); it++)res = res * ((*it).second + 1) % mod;cout << res << endl;return 0;}

约数之和

#include <iostream>#include <algorithm>#include <unordered_map>using namespace std;typedef long long LL;const int mod = 1e9 + 7;int main(){int n;cin >> n;unordered_map<int, int> primes;while (n--){int x;cin >> x;for (int i = 2; i <= x / i; i++)while (x % i == 0){x /= i;primes[i]++;}if (x > 1) primes[x]++;}LL res = 1;for (auto prime : primes){int p = prime.first, a = prime.second;LL t = 1;while (a--) t = (t * p + 1) % mod;res = res * t % mod;}cout << res << endl;return 0;}

欧几里得算法(辗转相除法)


int gcd(int a, int b) {if (b == 0)return a;return gcd(b, a % b);}int gcd(int a, int b){return b ? gcd(b, a % b) : a;}int gcd(int a, int b) {int tmp;while(b != 0) {tmp = b;b = a % b;a = tmp;}return a;}




Modular arithmetic模运算

大纲要求
•【3】整除、因数、倍数、指数、质数、合数、同余等概念
•【3】唯一分解定理
•【3】欧几里得算法(辗转相除法)
•【4】埃氏筛法和线性筛法求素数

