int prime[maxn];
bool flag[maxn];
void mkprime() {
memset(flag, -1, sizeof(flag));
for (int i = 2, plen = 0; i < N; i++) {
if (flag[i]) {
prime[plen++] = i;
}
for (int j = 0; (j < plen) && (i * prime[j] < N); j++) {
flag[i * prime[j]] = 0;
if (i % prime[j] == 0) {
break;
}
}
}
}
#define LL long long
const int PRIMERANGE = 10000000;
LL prime[PRIMERANGE + 1];
int getPrime(){
prime[0] = 0;
for(int i = 2; i < PRIMERANGE; i ++){
if(!prime[i]) prime[++prime[0] ] = i;
for(int j = 1; j <= prime[0] && prime[j] <= PRIMERANGE / i; j ++){
prime[prime[j] * i] = 1;
if(i % prime[j] == 0) break;
}
}
return prime[0];
}
求质因数:
void findpFactor(LL n) {
int i, te, cnt;
te = (int) sqrt(n * 1.0);
for (i = 0, len_pfactor = 0; (i < plen) && (prime[i] <= te); i++) {
if (n % prime[i] == 0) {
cnt = 0;
while (n % prime[i] == 0) {
cnt++;
n /= prime[i];
}
pfactor[len_pfactor] = prime[i];//有谁
cpfactor[len_pfactor++] = cnt;//有几个
}
}
if (n > 1) {
pfactor[len_pfactor] = n;
cpfactor[len_pfactor++] = 1;
}
}求所有质因数的乘积:
void dfs(int k, LL now) {
if (k == len_pfactor) {
factor[len_factor++] = now;
return;
}
int i;
for (i = 0; i < cpfactor[k]; i++) {
now = now * pfactor[k];
dfs(k + 1, now);
}
for (i = 0; i < cpfactor[k]; i++) {
now = now / pfactor[k];
}
dfs(k + 1, now);
}
本文介绍了一种高效的质数筛选方法及其实现,并详细解释了如何利用该方法进行整数分解,找到一个数的所有质因数及其出现次数。通过递归深度优先搜索实现了获取所有质因数组合的方法。
3885

被折叠的 条评论
为什么被折叠?



