1. 程式人生 > 其它 >一個數等於兩個不同素數的乘機_【朝夕的ACM筆記】數論-反素數

一個數等於兩個不同素數的乘機_【朝夕的ACM筆記】數論-反素數

技術標籤:一個數等於兩個不同素數的乘機判斷一個數是否為兩個素數乘積求n以內最大的k個素數以及它們的和輸入一個正整數求所有素數因子

【朝夕的ACM筆記】目錄與索引

反素數

一、基礎概念

反素數(Anti-prime number)是這樣的一類數:

對於正整數

,所有比 小的正整數,其因子個數都比 少,則稱 為反素數。

例如,前四個反素數是1,2,4,6。

以6來說明,6的因子個數為4(1,2,3,6),比任何一個小於6的正整數因子個數都要多。

反素數有兩個重要的性質:

①反素數

,且 ,其中 是不同的素數,且

我們知道,任何一個正整數都可以表示為若干素數的冪的乘積(其中素數就是其他素數的0次冪與該素數的1次冪的乘積,合數則可以通過分解質因數來得到),所以該性質前半部分很好理解。

後半部分則需要另一個重要定理:

對於正整數

的因子個數

這本質上就是在進行質因數的排列組合,若一個質因數

的次數為 ,則對於該質因數,存在不選,和選擇 次共 次可能,則不同的選擇導致產生的不同因子數量就是

而反素數要求我們使數字的因子個數儘量多,本身數值儘量小。

則根據上述定理,在因子個數固定的情況下,小的素數的次數必然更大,否則必存在數值更小且因子個數相同的另一個正整數。

舉例來說:若

,則因子個數為72個。但若是交換為 ,因子個數不變,但數值卻變小了,因為我們規定

②反素數的質因子必然是從2開始的連續素數。

由第①性質即可證,若存在一質因子

的次數為1,則 的次數必然都大於等於1。

二、求解反素數

一般的求解反素數題目都是讓求一定範圍內的最大反素數,其程式碼演算法使用的主要是反素數的兩個性質。

我們只需要通過DFS來列舉每個質因數的次數,並保證其單調不增,在過程中不斷更新答案即可。

值得一提的是,對於

以內的範圍,我們最多隻需要列舉前9個素數的次數即可,因為前10個素數累計相乘已經超出了這個範圍。而對於 ,我們最多隻需要列舉前14個素數(到43)即可。

參考程式碼:

#include