Euler_76.cpp (824B)
1 #include "Euler.h" 2 3 ll partition(int n, std::vector<int> &cache) 4 { 5 ll p = 0; 6 std::vector<int> cache_ref = cache; 7 8 if(n >= 0) 9 { 10 if(n == 0 || n == 1) 11 { 12 return 1; 13 } 14 if(cache_ref[n - 1] != 0) 15 { 16 return cache_ref[n - 1]; 17 } 18 19 int k = 1; 20 21 ll s1 = 0; 22 ll s2 = 0; 23 24 while (n - s2 >= 0) 25 { 26 s1 = (k * (3 * k - 1)) / 2; 27 s2 = (k * (3 * k + 1)) / 2; 28 29 int sign = (k - 1) & 1 ? -1 : 1; 30 31 p += sign * partition(n - s1, cache_ref); 32 p += sign * partition(n - s2, cache_ref); 33 ++k; 34 } 35 36 cache_ref[n - 1] = p; 37 } 38 39 return p; 40 } 41 42 int Euler::CountingSums() 43 { 44 std::vector<int> cache(100, 0); 45 return partition(100, cache) - 1; 46 }