牛客網 n的約數 dfs

2022-02-04 00:18:24 字數 1089 閱讀 8593

題目描述:戳這裡

解題思路:這題思路好想,n最多也就是20個不同的素數相乘,把所有可能的素數找到,然後列舉素數個數就行了。

n = p1^q1 + p2^q2 + p3 ^q3 + ... + pi ^qi;

約數個數也好找,有個約數個數定理:

對於乙個大於1正整數n可以分解質因數:

則n的正約數的個數就是

。其中a1、a2、a3…ak是p1、p2、p3,…pk的指數。

真正的難點在於剪枝:

從小到大dfs素數個數,後面的素數個數一定小於等於前面的素數個數。

這個很好想,既然能用大的素數,肯定也能用小的素數,所以如果大的素數個數比小的素數多,那就一定不是最優解。

比如n為10,可能會用到2 5 7這三個素數,如果用到了5,那肯定能用到2,而且2的個數一定》=5的個數。可能有人會問,那直接全用2不就行了,不一定,因為約數的個數f(n)並不恆大於a1*k2,看該題的樣例就知道了。

附ac**:

1 #include2 #include3 #include4 #include5 #include6

using

namespace

std;

7 typedef long

long

ll;8

const

int maxn = 111;9

ll nu[maxn],prim[maxn];

10bool

isprim[maxn];

11 ll prime[30]=;

12void

euler() 22}

23//

printf("%d",len);24}

25ll n;

26 ll maxx = 1e18, maxi = 0;27

void dfs(int

now, ll anss, ll ansi, ll pre)

34int i = 1;35

while(i <=pre) 42}

4344

intmain()

4556

return0;

57 }

view code

牛客 n的約數(約數定理)

時間限制 c c 1秒,其他語言2秒 空間限制 c c 262144k,其他語言524288k 64bit io format lld t次詢問,每次給你乙個數n,求在 1,n 內約數個數最多的數的約數個數 第一行乙個正整數t 之後t行,每行乙個正整數n輸出t行,每行乙個整數,表示答案 示例1 51...

牛客網 14 n的約數(數論)

題意 中文,就是求1 n中約數最多的數 思路 根據唯一分解定理,我們可以知道乙個數n a1 p1 a2 p2.的約數個數為 1 p1 1 p2 那麼1 n中約數最多的數我們應該怎麼求呢?根據公式我們可以知道我們讓p1,p2,pn最大就好了,那麼我們現在可以列舉乙個素數,列舉到他的次方大於n的時候,我...

牛客網 最大的奇約數

小易是乙個數論愛好者,並且對於乙個數的奇數約數十分感興趣。一天小易遇到這樣乙個問題 定義函式f x 為x最大的奇數約數,x為正整數。例如 f 44 11.現在給出乙個n,需要求出 f 1 f 2 f 3 f n 例如 n 7 f 1 f 2 f 3 f 4 f 5 f 6 f 7 1 1 3 1 5...