#include<stdio.h>
unsigned array[31][20] = {0};
//Calc value of num, where num = original_num divided by 2 for nthDiv2 times, and by 3 for nthDiv3 times
unsigned value(unsigned num, unsigned nthDiv2, unsigned nthDiv3)
{
// if value of n when divided by nthDiv2 and nthDiv3 is already calculated just return it from table
if (array[nthDiv2][nthDiv3] != 0)
return array[nthDiv2][nthDiv3];
// Base case - If trying to calculate value of number smaller than 12, return num
else if (num < 12)
return num;
// notice that for all numbers >= 12, dividing the coin is better strategy than keeping it as it is
// else - calculate the value we can get by splitting the coin into the coins num/2, num/3, and num/4
else {
unsigned result = value(num/2, nthDiv2+1, nthDiv3) +
value(num/3, nthDiv2, nthDiv3+1) + value(num/4, nthDiv2+2, nthDiv3);
// Memoize result - save it to our array, so we won't have to recompute it
array[nthDiv2][nthDiv3] = result;
return result;
}
}
int main(void) {
unsigned original_num = 0;
while (scanf("%u", &original_num
) != EOF
) { for (char i = 0; i < 31; i++)
for (char j = 0; j < 20; j++)
array[i][j] = 0;
printf("%u\n", value
(original_num
, 0, 0)); }
return 0;
}
I2luY2x1ZGU8c3RkaW8uaD4KCnVuc2lnbmVkIGFycmF5WzMxXVsyMF0gPSB7MH07CgovL0NhbGMgdmFsdWUgb2YgbnVtLCB3aGVyZSBudW0gPSBvcmlnaW5hbF9udW0gZGl2aWRlZCBieSAyIGZvciBudGhEaXYyIHRpbWVzLCBhbmQgYnkgMyBmb3IgbnRoRGl2MyB0aW1lcwp1bnNpZ25lZCB2YWx1ZSh1bnNpZ25lZCBudW0sIHVuc2lnbmVkIG50aERpdjIsIHVuc2lnbmVkIG50aERpdjMpCnsKICAgIC8vIGlmIHZhbHVlIG9mIG4gd2hlbiBkaXZpZGVkIGJ5IG50aERpdjIgYW5kIG50aERpdjMgaXMgYWxyZWFkeSBjYWxjdWxhdGVkIGp1c3QgcmV0dXJuIGl0IGZyb20gdGFibGUKICAgIGlmIChhcnJheVtudGhEaXYyXVtudGhEaXYzXSAhPSAwKQogICAgICAgIHJldHVybiBhcnJheVtudGhEaXYyXVtudGhEaXYzXTsKICAgIC8vIEJhc2UgY2FzZSAtIElmIHRyeWluZyB0byBjYWxjdWxhdGUgdmFsdWUgb2YgbnVtYmVyIHNtYWxsZXIgdGhhbiAxMiwgcmV0dXJuIG51bQogICAgZWxzZSBpZiAobnVtIDwgMTIpCiAgICAgICAgcmV0dXJuIG51bTsKCiAgICAvLyBub3RpY2UgdGhhdCBmb3IgYWxsIG51bWJlcnMgPj0gMTIsIGRpdmlkaW5nIHRoZSBjb2luIGlzIGJldHRlciBzdHJhdGVneSB0aGFuIGtlZXBpbmcgaXQgYXMgaXQgaXMKICAgIC8vIGVsc2UgLSBjYWxjdWxhdGUgdGhlIHZhbHVlIHdlIGNhbiBnZXQgYnkgc3BsaXR0aW5nIHRoZSBjb2luIGludG8gdGhlIGNvaW5zIG51bS8yLCBudW0vMywgYW5kIG51bS80CiAgICBlbHNlIHsKICAgICAgICB1bnNpZ25lZCByZXN1bHQgPSB2YWx1ZShudW0vMiwgbnRoRGl2MisxLCBudGhEaXYzKSArCiAgICAgICAgICAgICAgICB2YWx1ZShudW0vMywgbnRoRGl2MiwgbnRoRGl2MysxKSArIHZhbHVlKG51bS80LCBudGhEaXYyKzIsIG50aERpdjMpOwogICAgICAgIC8vIE1lbW9pemUgcmVzdWx0IC0gc2F2ZSBpdCB0byBvdXIgYXJyYXksIHNvIHdlIHdvbid0IGhhdmUgdG8gcmVjb21wdXRlIGl0CiAgICAgICAgYXJyYXlbbnRoRGl2Ml1bbnRoRGl2M10gPSByZXN1bHQ7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KfQoKaW50IG1haW4odm9pZCkgewogICAgdW5zaWduZWQgb3JpZ2luYWxfbnVtID0gMDsKICAgIHdoaWxlIChzY2FuZigiJXUiLCAmb3JpZ2luYWxfbnVtKSAhPSBFT0YpIHsKICAgICAgICBmb3IgKGNoYXIgaSA9IDA7IGkgPCAzMTsgaSsrKQogICAgICAgICAgICBmb3IgKGNoYXIgaiA9IDA7IGogPCAyMDsgaisrKQogICAgICAgICAgICAgICAgYXJyYXlbaV1bal0gPSAwOwogICAgICAgIHByaW50ZigiJXVcbiIsIHZhbHVlKG9yaWdpbmFsX251bSwgMCwgMCkpOwogICAgfQogICAgcmV0dXJuIDA7Cn0K