# Lookup Table# Array

b230 - TOI2009 第二題:方便數

🔗 前往 ZeroJudge 原題

題目描述

題目要求找出第 k 小的「方便數」。方便數的定義是找不到三個相異的正整數 a、b、c 使得 N = ab + bc + ca。題目給定了前 15 個方便數的例子,並要求針對 0 < k <= 65 的輸入,輸出第 k 小的方便數。

解題思路

由於題目限制 k 的範圍為 0 < k <= 65,且方便數的數量有限,最簡單且有效的方法是預先計算好前 65 個方便數,並將其儲存在一個陣列中。然後,程式只需要根據輸入的 k 值,從陣列中取出對應的方便數即可。此解法避免了複雜的演算法計算,直接利用查表法解決問題。

複雜度分析

  • 時間複雜度: O(1)
  • 空間複雜度: O(65)

程式碼

#include <iostream>
using namespace std;
int ans[66]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 15, 16, 18, 21, 22, 24, 25, 28, 30, 33, 37, 40, 42, 45, 48, 57, 58, 60, 70, 72, 78, 85, 88, 93, 102, 105, 112, 120, 130, 133, 165, 168, 177, 190, 210, 232, 240, 253, 273, 280, 312, 330, 345, 357, 385, 408, 462, 520, 760, 840, 1320, 1365, 1848};
int main(){
	int n;
	while(cin >> n)
		cout << ans[n-1] << '\n'; 
}

Discussion