poj 1411 Calling Extraterrestrial Intelligence Again
题意:给你数m,a,b,假设有数p,q,满足p*q<=m同时a/b<=p/q<=1,求当p*q最大的p和q的值
方法:暴力枚举 -_-|| and 优化范围
我们可以注意到在某一个m值得情况下,有一些小于m的值的质数根本不可能去到
以m=1680 a=5 b=16来举例,假设当前枚举的质数为x
那么既然选了这个x必然另外一个质数不可能小于x*5/16所以就可以得到一个方程
5/16*x^2<=1680
这样可以解出x=73.....(取整)
#include <iostream> #include <cstring> #include <cstdio> #include <queue> #include <algorithm> #include <cmath> #define maxn 100005 using namespace std; int prime[maxn],k=1; bool a[maxn]; void get_prime() { memset(prime,0,sizeof(0)); memset(a,true,sizeof(a)); a[1]=false; for(int i=2;i<maxn;i++) { if(a[i]) { prime[k++]=i; for(int j=i+i;j<maxn;j+=i) a[j]=false; } } } int main() { get_prime(); int m,a,b,p,q,fan,maxx; while(cin>>m>>a>>b) { if(a==0&&b==0&&m==0) break; fan=sqrt((double)m/a*b); maxx=-99; p=0;q=0; int t=lower_bound(prime+1,prime+k,fan)-prime; for(int i=1;i<=t;i++) { for(int j=i;j<=t;j++) { if(prime[i]*prime[j]>=maxx&&prime[i]*prime[j]<=m&&(double)prime[i]/prime[j]>=(double)a/b) { maxx=prime[i]*prime[j]; p=prime[i]; q=prime[j]; } } } cout<<p<<" "<<q<<endl; } return 0; }
你若是天才,我便是疯子