Problem 1232 : Calling Extraterrestrial Intelligence Again

Problem A: Calling Extraterrestrial Intelligence Again
http://rose.u-aizu.ac.jp/onlinejudge/ProblemSet/description.jsp?id=1232

  • 問題概要

整数m, a, bが与えられる。
素数p, qのうち、
p*q <= m && a/b <= p/q <= 1
であるもので最大のp*qになるような素数p*qを答えなさい。

  • 解法

p*qを決める。
p*qをmから減らしていって、そのp*qの値になるようなp*qが存在するか調べる。
pをループ回すと、pに対するqはひとつに定まる。
そのあと、a/b <= p/q <= 1になるか調べる。
最初に見つかったものが答え。

  • ソース
#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<sstream>
#include<cassert>
#include<queue>
#include<stack>

#define REP(i,b,n) for(int i=b;i<n;i++)
#define rep(i,n)   REP(i,0,n)
#define ALL(C)     (C).begin(),(C).end()
#define pb         push_back
#define mp         make_pair
#define vint       vector<int>
#define FOR(it,o)  for(__typeof((o).begin()) it=(o).begin(); it!=(o).end(); ++it)
#define lli	    long long int
#define ld	    long double

#define N 100000

using namespace std;


main(){

  int p[N];
  rep(i, N)p[i] = true;
  p[0] = p[1] = false;
  rep(i, N){
    if(!p[i])continue;
    for(int j=2; j*i < N; j++){
      p[i*j] = false;
    }
  }
  
  int m, a, b;
  while( cin >> m >> a >> b){
    if(m + a + b == 0)break;
    for(int i=m; i>=0; i--){
      bool found = false;
      for(int j = 2; j*j<=i; j++){
	if(i%j != 0)continue;
	if(!p[j] || !p[i/j])continue;
	if(((double)a/b) > ((double)j/(i/j)))continue;
	cout << j << ' ' << i/j << endl;
	found = true;
	break;
      }
      if(found)break;
    }
  }
}