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(判断条件)を満たす
#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; }