#include <iostream>
using namespace std;
// Number of ways to reduce score to 0 using n darts.
int dartsGame(int ndarts, int total){
// Maximum score is 60 per dart, so any higher total is impossible.
if(total > ndarts * 60) return 0;
// Final dart must land on double ring or bullseye
if(ndarts == 1){
if(total == 50) return 1;
if(total <= 40 && total%2 == 0) return 1;
return 0;
}
// Try all possible scores for the current dart
// Then recursively continue with 1 fewer darts.
int count = 0;
for(int score = 1; score <= 20; score++){
count += dartsGame(ndarts-1, total - score);
count += dartsGame(ndarts-1, total - 2*score);
count += dartsGame(ndarts-1, total - 3*score);
}
// Bullseye
count += dartsGame(ndarts-1, total - 50);
return count;
}
int main() {
cout << dartsGame(9, 501);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKLy8gTnVtYmVyIG9mIHdheXMgdG8gcmVkdWNlIHNjb3JlIHRvIDAgdXNpbmcgbiBkYXJ0cy4KaW50IGRhcnRzR2FtZShpbnQgbmRhcnRzLCBpbnQgdG90YWwpewoJCgkvLyBNYXhpbXVtIHNjb3JlIGlzIDYwIHBlciBkYXJ0LCBzbyBhbnkgaGlnaGVyIHRvdGFsIGlzIGltcG9zc2libGUuCglpZih0b3RhbCA+IG5kYXJ0cyAqIDYwKSByZXR1cm4gMDsKCQoJLy8gRmluYWwgZGFydCBtdXN0IGxhbmQgb24gZG91YmxlIHJpbmcgb3IgYnVsbHNleWUKCWlmKG5kYXJ0cyA9PSAxKXsKCQlpZih0b3RhbCA9PSA1MCkgcmV0dXJuIDE7CgkJaWYodG90YWwgPD0gNDAgJiYgdG90YWwlMiA9PSAwKSByZXR1cm4gMTsKCQlyZXR1cm4gMDsKCX0KCQoJLy8gVHJ5IGFsbCBwb3NzaWJsZSBzY29yZXMgZm9yIHRoZSBjdXJyZW50IGRhcnQKCS8vIFRoZW4gcmVjdXJzaXZlbHkgY29udGludWUgd2l0aCAxIGZld2VyIGRhcnRzLgoJaW50IGNvdW50ID0gMDsKCWZvcihpbnQgc2NvcmUgPSAxOyBzY29yZSA8PSAyMDsgc2NvcmUrKyl7CgkJY291bnQgKz0gZGFydHNHYW1lKG5kYXJ0cy0xLCB0b3RhbCAtIHNjb3JlKTsKCQljb3VudCArPSBkYXJ0c0dhbWUobmRhcnRzLTEsIHRvdGFsIC0gMipzY29yZSk7CgkJY291bnQgKz0gZGFydHNHYW1lKG5kYXJ0cy0xLCB0b3RhbCAtIDMqc2NvcmUpOwoJfQoJLy8gQnVsbHNleWUKCWNvdW50ICs9IGRhcnRzR2FtZShuZGFydHMtMSwgdG90YWwgLSA1MCk7CgkKCXJldHVybiBjb3VudDsKfQoKaW50IG1haW4oKSB7Cgljb3V0IDw8IGRhcnRzR2FtZSg5LCA1MDEpOwoJcmV0dXJuIDA7Cn0=