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;
}

 

posted @ 2016-09-08 16:07  邻家那小孩儿  阅读(146)  评论(0编辑  收藏  举报