Ranking (as of 2013-06-15): 248 out of 604
Language: C++
/* UVa 10759 - Dice Throwing To build using Visual Studio 2008: cl -EHsc -O2 dice_throwing.cpp */ #include <iostream> #include <algorithm> #include <cmath> using namespace std; const int n_max = 24, x_max = 150; long long dice_throwings[n_max + 1][x_max + 1]; // cache // dice_throwings[n][x] is the number of cases in which the sum of all thrown // dice is less than x when n dice are thrown void intialize_cache() { for (int i = 0; i <= n_max; i++) for (int j = 0; j <= x_max; j++) dice_throwings[i][j] = -1; dice_throwings[1][0] = 0; for (int j = 1; j <= 6; j++) dice_throwings[1][j] = j - 1; for (int j = 7; j <= x_max; j++) dice_throwings[1][j] = 6; } long long dice_throwing(int n, int x) // return the number of cases in which the sum of all thrown dice is less than x // when n dice are thrown { if (dice_throwings[n][x] != -1) return dice_throwings[n][x]; else { long long nr_cases = 0; for (int i = 1, j = min(x, 6); i <= j; i++) nr_cases += dice_throwing(n - 1, x - i); dice_throwings[n][x] = nr_cases; return nr_cases; } } long long calculate_gcd(long long a, long long b) { if (a < b) return calculate_gcd(b, a); if (!b) return a; else return calculate_gcd(b, a % b); } int main() { intialize_cache(); while (true) { int n, x; cin >> n >> x; if (!n && !x) break; long long denominator = static_cast<long long>( pow(6.0, static_cast<double>(n))); long long numerator = denominator - dice_throwing(n, x); if (numerator) { long long gcd = calculate_gcd(numerator, denominator); numerator /= gcd; denominator /= gcd; } if (!numerator) cout << 0 << endl; else if (denominator == 1) cout << 1 << endl; else cout << numerator << '/' << denominator << endl; } return 0; }
No comments:
Post a Comment