Paraffins: Difference between revisions
Content added Content deleted
imported>Andyqian7 (New algorithm) |
imported>Andyqian7 mNo edit summary |
||
Line 462: | Line 462: | ||
51: 2994664179967370611 |
51: 2994664179967370611 |
||
52: 8031081780535296591 |
52: 8031081780535296591 |
||
</pre> |
|||
</pre>This may be the fastest algorithm ever known, with complexity O(n^2). Computing for 1-1000 takes less than 1 second.<syntaxhighlight lang="c++"> |
|||
#include <gmpxx.h> |
|||
#include <iostream> |
|||
using namespace std; |
|||
vector<mpz_class> A = {1}, b, a; |
|||
int main() |
|||
{ |
|||
for (int m = 0; m < 1000; m++) |
|||
{ |
|||
mpz_class tmp = 0; |
|||
for (int i = 0; i <= m / 2; i++) |
|||
if (i * 2 != m) |
|||
tmp += A[i] * A[m - i]; |
|||
b.push_back(tmp); |
|||
tmp = 0; |
|||
for (int i = 0; i <= m; i++) |
|||
tmp += A[i] * b[m - i]; |
|||
for (int i = 0; i <= m / 2; i++) |
|||
if (3 * i != m) |
|||
tmp -= A[i] * A[i] * A[m - 2 * i]; |
|||
tmp /= 3; |
|||
a.push_back(tmp); |
|||
for (int i = 0; i <= m / 2; i++) |
|||
if (3 * i != m) |
|||
tmp += A[i] * (A[i] + 1) / 2 * A[m - 2 * i]; |
|||
if (m % 3 == 0) |
|||
tmp += A[m / 3] * (A[m / 3] + 1) * (A[m / 3] + 2) / 6; |
|||
A.push_back(tmp); |
|||
} |
|||
for (int n = 0; n <= 1000; n++) |
|||
{ |
|||
mpz_class B = 0; |
|||
for (int i = 1; i <= n / 2; i++) |
|||
if (i * 2 != n) |
|||
B += A[i] * A[n - i]; |
|||
if (n % 2 == 0) |
|||
B += A[n / 2] * (A[n / 2] + 1) / 2; |
|||
int m = n - 1; |
|||
mpz_class C = 0; |
|||
for (int i = 0; i <= m; i++) |
|||
C += A[i] * a[m - i]; |
|||
for (int i = 0; i <= m / 2; i++) |
|||
C -= A[i] * A[i] * b[m - 2 * i]; |
|||
for (int i = 0; i <= m / 3; i++) |
|||
if (4 * i != m) |
|||
C += A[i] * A[i] * A[i] * A[m - 3 * i]; |
|||
C /= 4; |
|||
for (int i = 0; i <= m / 2; i++) |
|||
C += A[i] * (A[i] + 1) / 2 * b[m - 2 * i]; |
|||
for (int i = 0; i <= m / 3; i++) |
|||
if (4 * i != m) |
|||
C -= A[i] * (A[i] + 1) / 2 * A[i] * A[m - 3 * i]; |
|||
if (m % 2 == 0) |
|||
for (int i = 0; i <= m / 4; i++) |
|||
if (4 * i != m) |
|||
C += A[i] * (A[i] + 1) / 2 * A[m / 2 - i] * (A[m / 2 - i] + 1) / 2; |
|||
for (int i = 0; i <= m / 3; i++) |
|||
if (4 * i != m) |
|||
C += A[i] * (A[i] + 1) * (A[i] + 2) / 6 * A[m - 3 * i]; |
|||
if (m % 4 == 0) |
|||
C += A[m / 4] * (A[m / 4] + 1) * (A[m / 4] + 2) * (A[m / 4] + 3) / 24; |
|||
if (n % 2) |
|||
cout << C - B << endl; |
|||
else |
|||
cout << C - B + A[n / 2] << endl; |
|||
} |
|||
} |
|||
</syntaxhighlight> |
|||
=={{header|D}}== |
=={{header|D}}== |
||
{{trans|Go}} |
{{trans|Go}} |