解題心得
原本的想法是用質數篩法建質數表,然後一個個用質因數分解找因數,因為一個數的因數數量就是質因數次方加一的乘積。
例:36 = 2^2 + 3^2,其因數數量為(2+1)*(2+1)=9。背後原因很簡單就不贅述。
不過寫完後發現會TLE,只好放棄。
參考了CPE提供的參考解法,發現解法其實很簡單。首先同樣要建表,這次建的是因數表。何謂因數?就是某數可以整除的數。反過來想,把某數的倍數與自己通通都加一,因為一定能整除。
為了近一步縮短時間,提前建好答案表。答案表紀錄從1~i的範圍內,因數數量最多的是誰。注意若數量相同,也要更新。
講起來很容易,但就是想不到啊。
程式碼
#include <iostream> using namespace std; #define SIZE 1000001 int table[SIZE] = { 0 }, ans[SIZE] = { 0 }; int main() { for (int i = 1; i < SIZE; i++) { for (int j = i; j < SIZE; j += i) table[j]++; } int maxIndex = 1, maxCount = 0; for (int i = 1; i < SIZE; i++) { if (table[i] >= maxCount) { maxIndex = i; maxCount = table[i]; } ans[i] = maxIndex; } int T, n; cin >> T; while (T--) { cin >> n; cout << ans[n] << endl; } return 0; }
沒有留言:
張貼留言