Project Euler 012積性函式性質

2021-08-29 00:15:44 字數 1685 閱讀 8857

題意:

​ 三角形數數列是通過逐個加上自然數來生成的。例如,第7個三角形數是 1 + 2 + 3 + 4 + 5 + 6 + 7 = 28。三角形數數列的前十項分別是:

​ 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, …

​ 讓我們列舉出前七個三角形數的所有約數:

1:13:1,3

6: 1,2,3,6

​ 10: 1,2,5,10

​ 15: 1,3,5,15

​ 21: 1,3,7,21

​ 28: 1,2,4,7,14,28

​ 我們可以看出,28是第乙個擁有超過5個約數的三角形數。

​ 第乙個擁有超過500個約數的三角形數是多少?

思路:​ 任何乙個數都可以寫成乙個或多個素數的乘積,我們設為n = p1^n1 * p2 ^ n2 *…

​ 因此,乙個數的因子個數,等同於(n1 + 1) * (n2 + 1) *…

​ 為什麼呢?我們可以想一下,對於素因子p1,我們有n1 + 1種選擇,分別是:不選,選乙個,選兩個…直到選n1個,同理p2有n2+1種選擇,所以種類數就是(n1 + 1) * (n2 + 1) *…

​ 因此,我們只需要計算乙個數有多少種素因子,每種素因子的個數,就可以通過算式直接求得乙個數的因子數,求法有兩種:

​ ——一種是預處理全部素數,然後每次遍歷整除直到該數為1,時間複雜度是o(n),其中n為滿足條件的數

​ ——另一種方式是建立記憶化陣列陣列,儲存每個數的最小素因子。再利用:如果a,b互質,那麼num(a ✖️ b) = num (a) ✖️ num(b) ,又因為三角形數都是n / 2 ✖️ (n - 1)或n / 2 ✖️ (n + 1)(n >= 2且n為偶數),所以我們只預處理sqrt(n)項即可(注:num(a)代表數字a的因子數),時間複雜度為o(sqrt(n))

**:

#include #include #include #define ll int64_t

#define d int32_t

#define f double

#define r return

#define mem(a) memset(a, 0, sizeof(a));

#define n 40000

d book[n + 5]; //儲存每個數的最小素因子

d prime[n + 5]; //儲存2~40000全部素數

d number[n + 5]; //儲存前40000數的因子數

//利用線性篩框架初始化

void init()

for (d j = 1; j <= prime[0] && prime[j] * i <= n; j++) }r;

}//用於求s(n)

ll mul (ll n)

//求n的因子數

d num(ll n)

r res * num(n);

}//利用當a,b互質,num(a * b) = num(a) * num(b)求a*b的因子數

void work ()

for (ll i = 2; i <= n; i += 2) else if(p2 > 500) }r;

}d main ()

答案是:76576500

如果有寫的不對或者不全面的地方 可通過主頁的****進行指正,謝謝

Project Euler 題目彙總

有乙個面試掛了,然後recruiter讓我多做題並且給我推薦了這個 還挺有趣的,來彙總一下題目 project euler 1.mutiples of 3 and 5 分析可能出現的數字,找規律,利用等差數列 arithmetic progression 求和來解決 project euler 2....

硬幣遊戲 Project Euler 232

原帖 project euler 上最近的題目都還比較意思,來看看前些天剛剛新鮮出爐的一道題 problem232 大意如此 說,有這樣乙個硬幣遊戲,需要兩個玩家參與,我們不防分別將他們稱為玩家 1和玩家 2。遊戲規則如下 兩個玩家輪流來擲硬幣。玩家 1每次只能擲一次,若是正面向上,則得 1分,否則...

Project Euler 014記憶化搜尋

今天做了將近10道project euler上的題,要麼和之前寫的題型類似,要麼簡單,14題雖然簡單些,但是勝在之前沒說過,就一併講一下吧。題意 在正整數集上定義如下的迭代序列 n n 2 若n為偶數 n 3n 1 若n為奇數 從13開始應用上述規則,我們可以生成如下的序列 13 40 20 10 ...