试除法求一个数的所有约数

  1. vector<int> get_divisors(int n){
  2. vector<int> res;
  3. for (int i = 1; i <= n / i; i ++ ){
  4. if(n % i == 0){
  5. res.push_back(i);
  6. if(i != n / i) res.push_back(n / i);
  7. }
  8. }
  9. sort(res.begin(), res.end());
  10. return res;
  11. }

约数个数

  1. #include <iostream>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <unordered_map>
  5. #include <vector>
  6. using namespace std;
  7. typedef long long ll;
  8. const int N = 110, mod = 1e9 + 7;
  9. int main()
  10. {
  11. int n;
  12. cin >> n;
  13. unordered_map<int, int> primes;
  14. while (n -- ){
  15. int x;
  16. cin >> x;
  17. for (int i = 2; i <= x / i; i ++ ){
  18. while(x % i == 0){
  19. x /= i;
  20. primes[i]++;
  21. }
  22. }
  23. if(x > 1) primes[x]++;
  24. }
  25. ll res = 1;
  26. for(auto p : primes) res = res * (p.second + 1) % mod;
  27. cout << res << endl;
  28. return 0;
  29. }

约数之和

  1. #include <iostream>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <unordered_map>
  5. #include <vector>
  6. using namespace std;
  7. typedef long long ll;
  8. const int N = 110, mod = 1e9 + 7;
  9. int main()
  10. {
  11. int n;
  12. cin >> n;
  13. unordered_map<int, int> primes;
  14. while (n -- ){
  15. int x;
  16. cin >> x;
  17. for (int i = 2; i <= x / i; i ++ ){
  18. while(x % i == 0){
  19. x /= i;
  20. primes[i]++;
  21. }
  22. }
  23. if(x > 1) primes[x]++;
  24. }
  25. ll res = 1;
  26. for(auto p : primes){
  27. ll a = p.first, b = p.second;
  28. ll t = 1;
  29. while(b--) t = (t * a + 1) % mod;
  30. res = res * t % mod;
  31. }
  32. cout << res << endl;
  33. return 0;
  34. }

欧几里得算法/辗转相除法

  1. int gcd(int a, int b) // 欧几里得算法
  2. {
  3. return b ? gcd(b, a % b) : a;
  4. }