赞
踩
本章博客将介绍质数和约数的常用模板,这些题目都比较简单,都可以通过暴力获取答案,但是时间复杂度较高,不符合算法比赛的要求,所以本篇博客介绍的方法都是时间复杂度低效率高的方法,并给出简化复杂度的思路。
质数部分将介绍:质数的判定,分解质因子,筛选质数
约数部分将介绍:求约数,约数的个数,约数之和,最大公约数
在大于1的整数中,如果只包含1和本身这两个约数,就被称为质数,或者素数
bool is_prime(int n)
{
if(n < 2) return false;
for(int i = 2; i <= n / i; i ++ )
if(n % i == 0)
return false;
return true;
}
void divide(int n) { for(int i = 2; i <= n / i; i ++ ) if(n % i == 0) { int s = 0; //次数 while(n % i == 0) { n /= i; s ++; } cout << i << ' ' << s << endl; } if(n > 1) cout << n << ' ' << 1 << endl; puts(""); //换行 }
const int N = 1000010; int primes[N], cnt; bool st[N]; //判断是否是合数 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; } } }
const int N = 1000010; int primes[N], cnt; bool st[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 % prime[j] == 0) break; } } }
约数,又称因数。整数a除以整数b(b≠0) 除得的商正好是整数而没有余数,就说a能被b整除,或b能整除a。a称为b的倍数,b称为a的约数。
vector<int> get_divisors(int n)
{
vector<int> res; //存n的所有约数
for(int i = 1; i <= n / i; i ++ )
{
res.push_back(i);
if(i != n / i) res.push_back(n / i);
}
sort(res.begin(), res.end());
return res;
}
/*题目:给定 n 个正整数 ai,请你输出这些数的乘积的约数个数,答案对 109+7 取模。*/ #include <iostream> #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; }
/*题目:给定 n 个正整数 ai,请你输出这些数的乘积的约数之和,答案对 109+7 取模。*/ #include <iostream> #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;
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。