试除法求一个数的所有约数
vector<int> get_divisors(int n){ vector<int> res; for (int i = 1; i <= n / i; i ++ ){ if(n % i == 0){ res.push_back(i); if(i != n / i) res.push_back(n / i); } } sort(res.begin(), res.end()); return res;}
约数个数
#include <iostream>#include <cstring>#include <algorithm>#include <unordered_map>#include <vector>using namespace std;typedef long long ll;const int N = 110, 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 p : primes) res = res * (p.second + 1) % mod; cout << res << endl; return 0;}
约数之和
#include <iostream>#include <cstring>#include <algorithm>#include <unordered_map>#include <vector>using namespace std;typedef long long ll;const int N = 110, 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 p : primes){ ll a = p.first, b = p.second; ll t = 1; while(b--) t = (t * a + 1) % mod; res = res * t % mod; } cout << res << endl; return 0;}
欧几里得算法/辗转相除法
int gcd(int a, int b) // 欧几里得算法{ return b ? gcd(b, a % b) : a;}