1 求素树
1 求解素树我们是利用筛法:对于不超过MAXN的每个整数x,我们只要去删除2x,3x,4x......,当处理完MAXN个数之后剩下的即为素数
2 时间复杂度分析:外层为O(n),内层总的次数为小于n/2+n/3+n/4+......+n/n,那么总的O(nlogn)
2 求因子个数
1 对于最大的值来说,我们只要枚举到sqrt(MAXN),然后我们对于每个i,去枚举j从(i+1, j*i<MAXN) , 这样我们求出
#include<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int MAXN = 1e6; int prime[MAXN]; int divide[MAXN]; // 求素树 void getPrime(){ bool vis[MAXN]; int pos = 0; memset(vis , false , sizeof(vis)); for(int i = 2 ; i < MAXN ; i++){ if(!vis[i]) prime[pos++] = i; for(int j = i*2 ; j < MAXN ; j += i) vis[j] = true; } } // 求因子的个数 void getDivide(){ int t = sqrt(MAXN*1.0); for(int i = 1 ; i <= t ; i++){ for(int j = i+1 ; j*i < MAXN ; j++) divide[i*j] += 2; //i和j是不同的,因此加2
divide[i*i]++; //i和i相同那么加1即可 } } int main(){ getPrime(); getDivide(); return 0; }
时间: 2024-09-10 05:12:33