题意:两个素数满足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;
- }