求1 N 的數中因子是最多的數及其最多的個數

2021-09-23 17:19:00 字數 1633 閱讀 6368

【問題描述】

求1~n當中約數個數最多的數的個數。

【輸入格式】

t組資料

每一組只有一行。這一行有乙個數n(1≤n<10^18)。

****** input313

91000000000000000000

****** output139

103680

分析:

直接暴力肯定會超時,那麼怎麼處理呢???

根據唯一分解定理,我們可以知道乙個整數是可以分解成素數的乘積的

那麼就可以得到:

將任意自然數 n (n>2) 分解

n=p1k1p2k2p3k3…pmkm(p1則 n 的因子數為

(k1+1)(k2+1)…(km+1)

但是直接這樣拆其因子也會引起超時的,那麼就需要去剪枝優化,肯定會有小夥伴們會這樣去想,列舉素因子的個數,先從最小的開始,然後選擇0個p1,1個p1,2個p1……,然後再去找0個p2,1個p2,2個p2……,將這些遍歷完之後去更新答案,不幸的是……………………這樣去做還是會超時的(ಥ_ಥ)

是不是還可以再去優化剪枝呢,答案是對;

我們看以下的例子:

6=2 * 3 ;10=2*5

6和10的質因數分解「模式」完全相同,所以它們的約數個數是相同的。但是由於3<5,所以6<10。

12=22*3 18=32*2

個數都是一樣的,問啥不去找最小的那乙個呢,因此我們在求其個數的時候可以加一下限制條件,即:

可以在列舉時進行乙個優化,使得列舉到的數字中2的指數不小於3的指數,3的指數不小於5的指數……這樣我們就能夠得到質因數分解「模式」相同的最小數

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

typedef

long

long ll;

const

int n =

1e6+10;

const

int inf=

0x3f3f3f3f

;const ll linf=

0x3f3f3f3f3f3f3f3f

;const

int mod=

1e9+7;

#define rep(i,a,b) for(int i=a;i<=b;i++)

#define abs(x) ((x)>=0?(x):-(x))

ll n,ans;

//假設給出的n是由連續相乘的素數得來的,那麼最多存在當前這些素數的乘積

int prime[20]

=;//1--16

void

dfs(ll m,ll res,

int i,

int limit)

}int

main()

return0;

}

求n個數 1 n 的質因子

求n個數 1 n 的質因子,我用到了素數篩選法的思想,例如找到素數2,2是2,4,6,8,10 的質因子,3是3,6,9,12 的質因子,然後找到素數5,若是求乙個數n的質因子,請參考 include includeint a 10001 20 b 10001 b i 表示第i個數的質因子個數,a ...

求n以內的所有因子數

在網上搜到的都是些求質因子的,剛好今天遇到一道題,題目思路錯了,就碼了乙個求乙個數所有因子的模板。再根據公式n p1 x1 p2 x2 pm xm,pi表示質因子數,xi表示其指數,從而可以看出n的所有因子都是可以通過質因子組合而來,並且有n的因子個數等於 x1 1 x2 1 xm 1 所以該模板的...

求1 n中1的個數

輸入乙個整數,求1 n這n個數的十進位制表示1的個數。將n的十進位制的每一位單獨拿出討論,每一位的值記為weight。1 個位 假若n 534。534的個位從0 9變化了53次,這53我們記為round。因為weight為4 0。因此第54輪為0 4,因此1出現了count round 1。若wei...