#43795: O(1) 解


s10900156@nhsh.tp.edu.tw (ShanC)

學校 : 臺北市立內湖高級中學
編號 : 138785
來源 : [118.167.222.118]
最後登入時間 :
2024-05-23 14:23:16
e602. 12208 - How Many Ones Needed? -- UVA | From: [118.167.228.3] | 發表日期 : 2024-11-01 13:31

建立一個函數可以算出 0 ~ n  的所有 1 的數量,再利用差分的原理把答案算出來

此函數具體來說可以利用 1 在二進位中每一位數出現的週期性來處理

舉例來說

像是 0 ~ 5 共 6 個數字的二進位如下:

000
001
010
011
100
101

可以發現
第一位 (最右) 出現了 3 個週期,每個週期出現 1 次 1 ,所以這裡共出現 3 * 1 + (6 mod 1) = 3
第二位出現了 1 個週期,每個週期出現 2 次 1,除此之外還出現了不到一個週期,但是沒有 1 所以不用算,所以共出現 1 * 2 + (6 mod 2)= 2
第三位出現了 0 個週期,每個週期出現 4 次 1,除此之外還出現了不到一個週期,所以共出現 0 * 4 + (6 mod 4) = 2
這樣 0 ~ 5 出現的 1 的數量就是 3 + 2 + 2 = 7

由於數字最大為 2 的 31 次方,因此每個數字判斷 32 次,每個 query 算兩次,所以 worst case 時間複雜度 32 * 2 = 64 = O(1)

水題

 
ZeroJudge Forum