一個數等於兩個不同素數的乘機_【朝夕的ACM筆記】數論-反素數
阿新 • • 發佈:2020-12-15
技術標籤:一個數等於兩個不同素數的乘機判斷一個數是否為兩個素數乘積求n以內最大的k個素數以及它們的和輸入一個正整數求所有素數因子
【朝夕的ACM筆記】目錄與索引
反素數
一、基礎概念
反素數(Anti-prime number)是這樣的一類數:
對於正整數
,所有比 小的正整數,其因子個數都比 少,則稱 為反素數。例如,前四個反素數是1,2,4,6。
以6來說明,6的因子個數為4(1,2,3,6),比任何一個小於6的正整數因子個數都要多。
反素數有兩個重要的性質:
①反素數
,且 ,其中 是不同的素數,且 。我們知道,任何一個正整數都可以表示為若干素數的冪的乘積(其中素數就是其他素數的0次冪與該素數的1次冪的乘積,合數則可以通過分解質因數來得到),所以該性質前半部分很好理解。
後半部分則需要另一個重要定理:
對於正整數
的因子個數這本質上就是在進行質因數的排列組合,若一個質因數
的次數為 ,則對於該質因數,存在不選,和選擇 次共 次可能,則不同的選擇導致產生的不同因子數量就是 。而反素數要求我們使數字的因子個數儘量多,本身數值儘量小。
則根據上述定理,在因子個數固定的情況下,小的素數的次數必然更大,否則必存在數值更小且因子個數相同的另一個正整數。
舉例來說:若
,則因子個數為72個。但若是交換為 ,因子個數不變,但數值卻變小了,因為我們規定 。②反素數的質因子必然是從2開始的連續素數。
由第①性質即可證,若存在一質因子
二、求解反素數
一般的求解反素數題目都是讓求一定範圍內的最大反素數,其程式碼演算法使用的主要是反素數的兩個性質。
我們只需要通過DFS來列舉每個質因數的次數,並保證其單調不增,在過程中不斷更新答案即可。
值得一提的是,對於
以內的範圍,我們最多隻需要列舉前9個素數的次數即可,因為前10個素數累計相乘已經超出了這個範圍。而對於 ,我們最多隻需要列舉前14個素數(到43)即可。參考程式碼:
#include