題意:
三角形數數列是通過逐個加上自然數來生成的。例如,第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 ...