标签:img for http inf eof memset 复杂度 break set
简单的引入一下欧拉函数
素数筛选知道4种,暴力筛(逐个判断),埃拉特斯特尼筛 ,欧拉线性筛 ,一个大于5的素数一定在6的倍数周围(PS:不知道官方名是什么)
埃拉特斯特尼筛法。时间复杂度为O(n loglog n)
//倍数筛除 时间复杂度(o(nloglogn) //一个素数的倍数一定不是素数 int vis[1000] , prime[1000]; void judge() { memset(vis,1,sizeof(vis)); int cnt=0; prime[0] = prime[1] = 0; for(int i=2;i<1000;i++) { if(vis[i]) { prime[cnt++] = i; //cout<<prime[cnt-1]<<endl; for(int j=i*i;j<1000;j+=i) vis[j] = 0; } } }
欧拉线性筛法 时间复杂度(o(n) )
//欧拉线性筛法 时间复杂度(o(n)) const int MAXN=3000001; int prime[MAXN];//保存素数 bool vis[MAXN];//初始化 void Prime(int n) { int cnt=0; memset(vis,1,sizeof(vis)); for(int i=2;i<=n;i++) { if(vis[i]) { prime[cnt++] = i; /* cout<<prime[cnt-1]<<endl; */ } for(int j=0 ; j<cnt && i*prime[j]<n;j++) { // i*prime[j]<=n 容易将最后一个筛出 vis[ i*prime[j] ] = 0; if(i%prime[j]==0) break;//避免重复筛 } } cout<<cnt<<endl; }
一个大于5的素数一定在6的倍数周围
//一个大于5的素数一定在6的倍数周围(时间复杂度小于sqrt(n)) // 判断素数 typedef long long ll; ll n,m; ll prime(ll n) { if(n < 2)return 0; if(n ==2 || n == 3)return 1; if(n % 6 != 1 && n % 6 != 5)return 0; for(ll i = 5; i * i <= n; i += 6) { if(n % i == 0 || n % (i + 2) == 0) return 0; } return 1; }
证明:
标签:img for http inf eof memset 复杂度 break set
原文地址:https://www.cnblogs.com/Shallow-dream/p/11429071.html