Throwing Dice

Your task is to calculate the number of ways to get a sum n by throwing dice. Each throw yields an integer between 16.

For example, if n = 10, some possible ways are 3+ 3+ 4 and 

Example:

Input:  n = 8
Output: 125

Approach

C++

#include <bits/stdc++.h>
using namespace std;

const long long MOD = 1e9 + 7;

template <class T>
struct matrix
{
    vector<vector<T>> m;
    long long rc;
    matrix() : r(), c() {}
    matrix(long long rlong long cT x) : r(r), c(c), m(rvector<T>(cx)) {}
    matrix(long long n) : matrix(nn0)
    {
        // identity matrix
        for (long long i = 0i < ni++)
            m[i][i] = 1;
    }
    matrix operator*(matrix<Tb)
    {
        matrix<Ta = *this;
        assert(a.c == b.r);
        matrix<To(a.rb.c0);
        for (long long i = 0i < a.ri++)
            for (long long j = 0j < b.cj++)
                for (long long k = 0k < a.ck++)
                    o.m[i][j] = (o.m[i][j] + a.m[i][k] * b.m[k][j]) % MOD;
        return o;
    }
    matrix operator^(long long b)
    {
        assert(r == c);
        matrix<Ta(rc0);
        for (long long i = 0i < ri++)
            for (long long j = 0j < cj++)
                a.m[i][j] = m[i][j];
        matrix<To(r);
        while (b)
        {
            if (b % 2)
                o = o * a;
            a = a * a;
            b /= 2;
        }
        return o;
    }
};

long long throwingDice(long long n)
{

    n += 5;
    matrix<long longA(160);
    A.m[0][5] = 1;
    matrix<long longB(660);
    for (long long i = 1i < 6i++)
        B.m[i][i - 1] = 1;
    for (long long i = 0i < 6i++)
        B.m[i][5] = 1;
    A = A * (B ^ n);
    return A.m[0][0];
}

int main()
{
    long long n = 8;

    cout << throwingDice(n<< "\n";

    return 0;
}


No comments:

Post a Comment