首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

HDU 4002 Find the Maximum:歐拉函數性質與貪心構造最大比值

     編輯:關於C++

題目大意

給定整數 n,求 x ∈ [1, n] 使 x / φ(x) 最大,其中 φ(x) 為歐拉函數(≤x 且與 x 互質的正整數個數)。

數學推導

歐拉函數為積性函數:若 x = p1^a1 * p2^a2 * ...,則

φ(x) = x * ∏(1 - 1/pi)
x / φ(x) = ∏(pi / (pi - 1))

每個質因子 p 貢獻因子 p/(p-1),p 越小貢獻越大(2→2.0, 3→1.5, 5→1.25...)。

結論:為最大化比值,x 應包含盡可能多的不同小質數。即 x = 2 * 3 * 5 * 7 * 11 * ...(質數連乘),不超過 n 的最大前綴乘積。

算法流程

  1. 預計算質數表(篩法,至乘積超 10^100 即可)。
  2. 預計算前綴乘積 fac[i] = fac[i-1] * prime[i](大整數)。
  3. 每測試用例:二分/線性查找最大 fac[i] ≤ n,輸出 fac[i]。

Java 大整數實現

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved