您的位置:首页 > 其它

uva 11105 Semi-Prime H-number 筛法

2016-11-08 15:56 357 查看
<pre name="code" class="html">
点击打开链接

</pre><pre code_snippet_id="1973199" snippet_file_name="blog_20161108_4_7065142" name="code" class="cpp">
</pre><pre code_snippet_id="1973199" snippet_file_name="blog_20161108_5_2746744" name="code" class="cpp">#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <map>
using namespace std;
typedef long long ll;
const int N=1e6+1;
const ll inf=1<<30;
vector<int> h;
int vis
;
ll pri
;
int main()
{
int n;
memset(vis,0,sizeof(vis));
for(int i=0;4*i+1<=N;i++)
{
h.push_back(i*4+1);
}
vis[h[0]]=1;
int pn=0;
for(int i=1;i<h.size();i++)//晒出h素数
{
if(!vis[h[i]])
{
pri[pn++]=h[i];
for(int j=h[i]+h[i];j<=N;j+=h[i])
{
vis[j]=1;//H素数只能写成1*h 素数的倍数不是素数
}
}
}

while(cin>>n&&n)
{
memset(vis,0,sizeof(vis));
ll ans=0;
// 1e4 cout<<pn<<endl;

//筛出H素数后 定义Semi-prime为两个H素数乘积 暴力即可
for(int i=0;i<pn;i++)
{
if(pri[i]*pri[i]>n) //n<=1e6
break;
for(int j=i;j<pn;j++)
{
int mul=pri[i]*pri[j];
if(mul<=n)
{
if(!vis[mul])
{
vis[mul]=1;
ans++;
}
}
else
break;
}
}
cout<<n<<' '<<ans<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: