数论 hdu_1239

来源:互联网 发布:新浪微博数据 编辑:程序博客网 时间:2024/05/23 12:06

http://acm.hdu.edu.cn/showproblem.php?pid=1239


/*p,q的范围其实可在2—50000(why?)然而,这是最小的范围吗?考虑大于10000的某个质数,不妨设为Q,另一个质数为P,则:如果P<10,P/Q<0.001如果P>10,P*Q>100000而考虑到a,b的取值范围(1<=a<=b<=1000)可知min(a/b)=0.001同时,要求: p*q<=m<=100000所以无论如何质数都不能超过10000接下来暴力枚举就可以了*/#include<stdio.h>int pri[10000],cnt;void fun(){    bool p[10000]={0};    int i,j;    for(i=2;i<10000;++i)        if(!p[i])            for(j=2;i*j<10000;++j)                    p[i*j]=1;    for(cnt=0,j=2;j<10000;++j)        if(!p[j])            pri[cnt++]=j;}void solve(const int &m,const int& a,const int& b){    int i,j,mm=1,p,q;    for(i=0;i<cnt;++i)    if(pri[i]<m)        for(j=i;j<=cnt;++j)        {            if(pri[i]*pri[j]<=m&&pri[i]*b>=a*pri[j]&&pri[i]*pri[j]>mm)            {                mm=pri[i]*pri[j];                p=i;                q=j;            }        }    printf("%d %d\n",pri[p],pri[q]);}int main(){    fun();    int m,a,b;    while(scanf("%d%d%d",&m,&a,&b)==3&&m)        solve(m,a,b);    return 0;}


原创粉丝点击