您的位置:首页 > 其它

poj 1411 素数筛选

2014-11-09 18:48 309 查看


题意:两个素数满足l,r->l*r<=m和a/b<=(l/r)<=1


解法:素数筛选,暴力寻找


素数筛选的时候第二组j=i*i才行,要不超时,并且要用Longlong否则会RE


代码
/*************************************************************************
> File Name: poj1411.cpp
> Author: cy
> Mail: 1002@qq.com
> Created Time: 14/11/9 18:11:49
************************************************************************/

#include<iostream>
#include<cstring>
#include <algorithm>
#include<cstdlib>
#include<vector>
#include<cmath>
#include<stdlib.h>
#include<iomanip>
#include<list>
#include<deque>
#include<map>
#include <stdio.h>
#include <queue>

const int maxn=100000+5;

#define inf 0x3f3f3f3f
#define INF 0x3FFFFFFFFFFFFFFFLL
#define rep(i,n) for(i=0;i<n;i++)
#define reP(i,n) for(i=1;i<=n;i++)

#define ull unsigned long long
#define ll long long

#define cle(a) memset(a,0,sizeof(a))

using namespace std;
int m,a,b;
int ip=0;
int used[maxn];
int prime[maxn];
void init()
{
ll i,j;
ip=0;
cle(used);
for(i=2;i<maxn;i++)
{
if(used[i]==0)
{
prime[ip++]=i;
for(j=i*i;j<maxn;j+=i)
{
used[j]=1;
}
}
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
#endif
init();
while(scanf("%d%d%d",&m,&a,&b)!=EOF)
{
if(m==0&&a==0&&b==0)break;
int ans=0;
int l,r;int i,j;
for(i=0;i<ip;i++)
{
for(j=0;j<=i;j++)
{
int sum=prime[j]*prime[i];
if(sum>m)break;
if(prime[j]*b>=prime[i]*a&&ans<sum){
ans=sum;
l=prime[j];
r=prime[i];
}
}
}
printf("%d %d\\n",l,r);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: