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

HDU 2964 Prime Bases:質數基底分解算法詳解

     編輯:關於C語言

題目大意

給定整數 n,將其分解為特定「質數基底」的線性組合:
n = a0 + a1*p0 + a2*p0*p1 + a3*p0*p1*p2 + ...
其中 p0=2, p1=3, p2=5, p3=7... 為前幾個質數。基底序列為:1, 2, 2×3, 2×3×5, 2×3×5×7...

算法核心洞察

  1. 基底遞增性:基底嚴格遞增,超過 n 的基底係數必為 0,無需處理。
  2. 模運算性質:對第 k 個基底 B_k,n % B_k 的結果必小於下一個質數 p_k。否則說明應使用更大基底,矛盾。
  3. 遞推正確性:從最大基底向下處理,每步取商為係數,餘數傳遞給下一輪,數學歸納法保證正確。

關鍵代碼實現

const int prime[] = {2,3,5,7,11,13,17,19,23,29,31,37,39,41,43,47,51,53,57,59};
__int64 a[21];  // 基底陣列:a[0]=1, a[i]=a[i-1]*prime[i-1]
int b[21], rem; // b存係數,rem記錄最大基底位置

void init() {
    a[0] = 1;
    for (int i=1; i<=20; i++) a[i] = a[i-1] * prime[i-1];
}

void deal(int n) {
    // 找到最大基底位置 rem
    for (int i=0; i<=20; i++)
        if (a[i] <= n && a[i+1] > n) { rem = i; break; }
    
    memset(b, 0, sizeof(b));
    for (int i=rem; i>=0; i--) {
        b[i] = n / a[i];  // 係數
        n = n % a[i];     // 餘數傳遞
    }
}

void output(int n) {
    cout << n << " = ";
    for (int i=0; i<=rem; i++)
        if (b[i]) {
            cout << b[i];
            for (int j=0; j

注意事項

  • 陣列 a 可能溢出 64 位,但題目數據僅 32 位,實際用不到溢出部分,不影響結果。
  • 質數表前 20 個足夠覆蓋 32 位整數範圍。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved