http://acm.hdu.edu.cn/showproblem.php?pid=1239
题目很长,长就不说了,还是英文,这么长的英文也就算了,居然还是水题,我靠,坑嗲啊!!!
题意:输入 m a b 三个数
输出:p q
要求: p q 是素数,且 p*q <=m 是 <= ,,且 a/b <= p/q <= 1
4 < m <= 100000 and 1 <= a <= b <= 1000.
p,q的范围其实可在2—50000(why?)
然而,这是最小的范围吗?
考虑大于10000的某个质数,不妨设为Q,另一个质数为P,则:
1、如果P<10,P/Q<0.001
2、如果P>10,P*Q>100000
而考虑到a,b的取值范围(1<=a<=b<=1000)
可知min(a/b)=0.001
同时,要求: p*q<=m<=100000
所以无论如何质数都不能超过10000。(事实上,不会超过9091)
#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;
int l = 0;
int prim[10005] = {1}, s[10005];
void prime()
{
int i, j;
memset(prim, 0, sizeof(prim));
for (i = 2; i < 10005; i++)
{
if (prim[i])
{
continue;
}
for (j = i + i; j < 10005; j += i)
{
prim[j] = 1;
}
s[l++] = i;
}
}
int main()
{
//freopen("1.in","r",stdin);
//freopen("1.out","w",stdout);
prime();
int m;
double a , b;
while (~scanf("%d %lf %lf", &m, &a, &b) && (m != 0 && a + b != 0))
{
int p = 0, q = 0;
double x = a / b, y;
int i, j;
for (i = 0; i < l; i++)
{
if (s[i] > m)
{
break;
}
else
{
for (j = i; j<l ; j++)
{
y = (double)s[i] / s[j];
if (y >= x && s[i]*s[j] > q * p && s[i]*s[j] <= m)
{
p = s[i];
q = s[j];
}
}
}
}
printf("%d %d\n", p, q);
}
}