Repository navigation
Expand file tree
/
Copy pathproject_euler.h
More file actions
executable file
·66 lines (52 loc) · 1.7 KB
/
Copy pathproject_euler.h
File metadata and controls
executable file
·66 lines (52 loc) · 1.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#pragma once
inline uint64_t triangleNumber(double index) {
return static_cast<uint64_t>((index + 1) * index / 2);
}
#define MAX_PRIME_BUF_SIZE 256
uint64_t primeBuf[MAX_PRIME_BUF_SIZE] = {3, 5};
uint64_t size = 1;
bool isPrime(uint64_t num) {
if (~num & 1) return num == 2;
if (num == 1) return false;
for (uint64_t i = 0; i <= size; i++)
if (num == primeBuf[i]) return true;
for (uint64_t i = primeBuf[size]; i * i <= num; i += 2)
if (num % i == 0) return false;
if (size < MAX_PRIME_BUF_SIZE - 1) primeBuf[size] = num;
return true;
}
bool check(uint64_t num) {
for (uint64_t i = 0; i <= size; i++)
if (num == primeBuf[i]) return true;
for (uint64_t i = primeBuf[size]; i * i <= num; i += 2)
if (num % i == 0) return false;
if (size < MAX_PRIME_BUF_SIZE - 1) primeBuf[size] = num;
return true;
}
uint64_t getFactorCount(uint64_t num) {
uint64_t result = 1;
uint64_t factor_power = 2;
if (isPrime(num)) return 2;
if (~num & 1) {
num /= 2;
for (; ~num & 1; num /= 2)
factor_power++;
result *= factor_power;
}
for (uint64_t i = 3; i <= num; i += 2) {
if (!check(i)) continue;
if (num % i == 0) {
num /= i;
factor_power = 2;
for (; num % i == 0; num /= i)
factor_power++;
result *= factor_power;
}
}
return result;
}
uint64_t smallestTriangleNumberWithOverXAmountOfFactors(uint64_t X) {
for (uint64_t i = 2; i < UINT64_MAX; i++)
if (getFactorCount(triangleNumber(i)) >= X) return triangleNumber(i);
return 0;
}