class MASH
{
    int q[4];       // Latch outputs
    int c[4][4];    // Carry flip flops

public:
    MASH() // Constructor
    { 
        // Initial values
        memset(c, 0, sizeof c);
        q[0] = 1;
        q[1] = 0;
        q[2] = 0;
        q[3] = 0;

        // Fill flip-flops
        for (int i=0; i<4; i++) Clock();
    }

    int Clock()
    {
        int d[4]; // Adder output / latch data input

        // Carry flip-flops
        c[3][3] = c[3][2]; c[3][2] = c[3][1]; c[3][1] = c[3][0];
                           c[2][2] = c[2][1]; c[2][1] = c[2][0];
                                              c[1][1] = c[1][0];

        // Adders
        d[0] = (q[0]+   F) % MODULO;
        d[1] = (q[1]+d[0]) % MODULO;
        d[2] = (q[2]+d[1]) % MODULO;
        d[3] = (q[3]+d[2]) % MODULO;

        // Carries
        c[0][0] = (q[0]+   F) / MODULO;
        c[1][0] = (q[1]+d[0]) / MODULO;
        c[2][0] = (q[2]+d[1]) / MODULO;
        c[3][0] = (q[3]+d[2]) / MODULO;

        // Latch
        for (int i=0; i<4; i++) q[i] = d[i];

        return  c[0][0] +
                c[1][0] -   c[1][1] +
                c[2][0] - 2*c[2][1] +   c[2][2] +
                c[3][0] - 3*c[3][1] + 3*c[3][2] - c[3][3];
    }
};