hdu 1239 Calling Extraterrestrial Intelligence Again(数学の問題)
5359 ワード
問題の意味と解題の構想:
m,a,bを入力する.出力c,d
条件を満たす:
1.2つの質量数c,dを見つけた.(大素数表)
2.c*dがm以下の最大値を満たす(ループ判定)
まず最大のdを探して、それから循環して(m/d条件の下で)最大のcを見つけて、
また、1回のd*c最大の条件を用いて、ループ条件を見つけたc"dから脱退しなければならない.
3.d>=c&&a*d<=b*c(判断条件)を満たす
m,a,bを入力する.出力c,d
条件を満たす:
1.2つの質量数c,dを見つけた.(大素数表)
2.c*dがm以下の最大値を満たす(ループ判定)
まず最大のdを探して、それから循環して(m/d条件の下で)最大のcを見つけて、
また、1回のd*c最大の条件を用いて、ループ条件を見つけたc"dから脱退しなければならない.
3.d>=c&&a*d<=b*c(判断条件)を満たす
#include<stdio.h>
#include<math.h>
const int M=150000;
int a[M];
int isprime()
{
for(int i=0;i<M;i++)
a[i]=i;
a[1]=0;
for(int i=2;i<sqrt((double)M);i++)
{
if(a[i]!=0)
for(int j=2;i*j<M;j++)
a[i*j]=0;
}
return 0;
}
int main()
{
int m,ai,b;
int t,c,d,e,max;
isprime();
while(scanf("%d %d %d",&m,&ai,&b)!=EOF&&m!=0&&ai!=0&&b!=0)
{
c=0;
max=0;
for(int i=m;i>=1;i--)
{
if(a[i]!=0)
{
//printf("%d**
",a[i]);
d=a[i];
for(int j=m/d;j>=1;j--)
if(a[j]!=0)
{
//printf("%d
",a[j]);
t=a[j];
if(b*t>=ai*d&&t<=d)
{
if(d*t>e*c)
{
e=d;
c=a[j];
}
break;
}
}
}
if(t<=d)continue;
if(c!=0)break;
}
printf("%d %d
",c,e);
}
return 0;
}