PKU1411

给定整数m,a,b(4 < m <= 100000 and 1 <= a <= b <= 1000)
需要找到两个数(不妨设为p,q)满足以下条件:
    p,q均为质数;
    p*q<=m;
    a/b <= p/q <= 1;
输出所有满足以上条件的p,q中乘积最大的一对p,q;




分析:
p,q的范围其实可在2—50000(why?)
   (事实上,很多通过的程序就采取的事这种思路,然而这是最小的范围吗?)
考虑9091这个数
   2/9091=0.00022
   3/9091=0.00033
   5/9091=0.00055
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<map>
#include<iostream>
#include<math.h>
#include <queue>
#include<algorithm>
using namespace std;
#define inf 2147483646
#define pi 3.1415926535898
#define N 33
#define LL __int64
int main()
{
   int m,a,b;
   int prime[2001],i,j,num=0,n;
   for(i=2;i<9091;i++)
   {
	   n=0;
      for(j=2;j*j<=i;j++)
	  {
	     if(i%j==0)
		 {
		    n=1;
			break;
		 }
	  }
	  if(!n)
		  prime[num++]=i;
   }
   while(scanf("%d%d%d",&m,&a,&b)&&(a+b+m))
   {
	   int max=0,p,q;
	   double k=(double)a/b;
      for(i=num-1;i>=0;i--)
	  {
		  if(prime[i]>m) continue;
	      for(j=i;j<=num-1;j++)
		  {
		     if(prime[j]>m||prime[i]*prime[j]>m||((double)prime[i]/prime[j])<k)
				 break;
			 if(prime[i]*prime[j]>max)
			 {
				 max=prime[i]*prime[j];
				 p=prime[i];q=prime[j];
			 }
		  }
	  }
	  printf("%d %d\n",p,q);
   }
}


   7/9091=0.00077
   而考虑到a,b的取值范围(1<=a<=b<=1000)
   可知min(a/b)=0.001
   所以2,3,5,7均不能作为p.
   min(p)=11;
   而11*9091=100001>100000;
   所以无论如何9091都不能作为q


而超过9091的数则更不可能。
所以p,q只能在2—9091中取值,从而使问题大大简化

你可能感兴趣的:(PKU1411)