若还想更快的话,那就直接查表(这个表是利用楼上的代码生成的)
程序代码:
unsigned foo( unsigned a, unsigned b, unsigned n )
{
static const unsigned maps[7][7][50] =
{
{
/*[0][0] =*/ { 1, 0 },
/*[0][1] =*/ { 1, 1 },
/*[0][2] =*/ { 6, 1, 2, 2, 4, 4, 1 },
/*[0][3] =*/ { 12, 1, 3, 3, 2, 2, 6, 6, 4, 4, 5, 5, 1 },
/*[0][4] =*/ { 6, 1, 4, 4, 2, 2, 1 },
/*[0][5] =*/ { 12, 1, 5, 5, 4, 4, 6, 6, 2, 2, 3, 3, 1 },
/*[0][6] =*/ { 4, 1, 6, 6, 1 }
},
{
/*[1][0] =*/ { 1, 1 },
/*[1][1] =*/ { 16, 1, 2, 3, 5, 1, 6, 0, 6, 6, 5, 4, 2, 6, 1, 0, 1 },
/*[1][2] =*/ { 6, 1, 3, 5, 4, 0, 1 },
/*[1][3] =*/ { 24, 1, 4, 0, 5, 5, 6, 0, 4, 4, 2, 0, 6, 6, 3, 0, 2, 2, 1, 0, 3, 3, 5, 0, 1 },
/*[1][4] =*/ { 48, 1, 5, 2, 1, 2, 6, 0, 3, 3, 1, 6, 3, 6, 4, 0, 2, 2, 3, 4, 2, 4, 5, 0, 6, 6, 2, 5, 6, 5, 1, 0, 4, 4, 6, 1, 4, 1, 3, 0, 5, 5, 4, 3, 5, 3, 2, 0, 1 },
/*[1][5] =*/ { 21, 1, 6, 4, 6, 5, 0, 4, 4, 3, 2, 3, 6, 0, 2, 2, 5, 1, 5, 3, 0, 1 },
/*[1][6] =*/ { 6, 1, 0, 6, 6, 0, 1 }
},
{
/*[2][0] =*/ { 3, 1, 2, 4 },
/*[2][1] =*/ { 6, 1, 3, 0, 3, 6, 1 },
/*[2][2] =*/ { 48, 1, 4, 3, 0, 6, 5, 1, 5, 5, 6, 1, 0, 2, 4, 5, 4, 4, 2, 5, 0, 3, 6, 4, 6, 6, 3, 4, 0, 1, 2, 6, 2, 2, 1, 6, 0, 5, 3, 2, 3, 3, 5, 2, 0, 4, 1, 3, 1 },
/*[2][3] =*/ { 6, 1, 5, 6, 6, 2, 1 },
/*[2][4] =*/ { 48, 1, 6, 2, 0, 1, 2, 1, 3, 3, 4, 6, 0, 3, 6, 3, 2, 2, 5, 4, 0, 2, 4, 2, 6, 6, 1, 5, 0, 6, 5, 6, 4, 4, 3, 1, 0, 4, 1, 4, 5, 5, 2, 3, 0, 5, 3, 5, 1 },
/*[2][5] =*/ { 24, 1, 0, 5, 3, 3, 0, 1, 2, 2, 0, 3, 6, 6, 0, 2, 4, 4, 0, 6, 5, 5, 0, 4, 1 },
/*[2][6] =*/ { 1, 1 }
},
{
/*[3][0] =*/ { 6, 1, 3, 2, 6, 4, 5 },
/*[3][1] =*/ { 16, 1, 4, 6, 1, 2, 0, 2, 6, 6, 3, 1, 6, 5, 0, 5, 1 },
/*[3][2] =*/ { 48, 1, 5, 3, 5, 0, 3, 2, 5, 5, 4, 1, 4, 0, 1, 3, 4, 4, 6, 5, 6, 0, 5, 1, 6, 6, 2, 4, 2, 0, 4, 5, 2, 2, 3, 6, 3, 0, 6, 4, 3, 3, 1, 2, 1, 0, 2, 6, 1 },
/*[3][3] =*/ { 42, 1, 6, 0, 4, 5, 6, 5, 5, 2, 0, 6, 4, 2, 4, 4, 3, 0, 2, 6, 3, 6, 6, 1, 0, 3, 2, 1, 2, 2, 5, 0, 1, 3, 5, 3, 3, 4, 0, 5, 1, 4, 1 },
/*[3][4] =*/ { 6, 1, 0, 4, 5, 3, 1 },
/*[3][5] =*/ { 1, 1 },
/*[3][6] =*/ { 8, 1, 2, 5, 6, 6, 5, 2, 1 }
},
{
/*[4][0] =*/ { 3, 1, 4, 2 },
/*[4][1] =*/ { 16, 1, 5, 0, 5, 6, 1, 3, 6, 6, 2, 0, 2, 1, 6, 4, 1 },
/*[4][2] =*/ { 48, 1, 6, 5, 4, 5, 0, 3, 5, 5, 2, 4, 6, 4, 0, 1, 4, 4, 3, 6, 2, 6, 0, 5, 6, 6, 1, 2, 3, 2, 0, 4, 2, 2, 5, 3, 1, 3, 0, 6, 3, 3, 4, 1, 5, 1, 0, 2, 1 },
/*[4][3] =*/ { 21, 1, 0, 3, 5, 1, 5, 2, 2, 0, 6, 3, 2, 3, 4, 4, 0, 5, 6, 4, 6, 1 },
/*[4][4] =*/ { 1, 1 },
/*[4][5] =*/ { 6, 1, 2, 6, 6, 5, 1 },
/*[4][6] =*/ { 8, 1, 3, 4, 6, 6, 4, 3, 1 }
},
{
/*[5][0] =*/ { 6, 1, 5, 4, 6, 2, 3 },
/*[5][1] =*/ { 6, 1, 6, 3, 0, 3, 1 },
/*[5][2] =*/ { 48, 1, 0, 2, 3, 5, 3, 4, 5, 5, 0, 3, 1, 4, 1, 6, 4, 4, 0, 1, 5, 6, 5, 2, 6, 6, 0, 5, 4, 2, 4, 3, 2, 2, 0, 4, 6, 3, 6, 1, 3, 3, 0, 6, 2, 1, 2, 5, 1 },
/*[5][3] =*/ { 1, 1 },
/*[5][4] =*/ { 48, 1, 2, 0, 1, 5, 1, 4, 3, 3, 6, 0, 3, 1, 3, 5, 2, 2, 4, 0, 2, 3, 2, 1, 6, 6, 5, 0, 6, 2, 6, 3, 4, 4, 1, 0, 4, 6, 4, 2, 5, 5, 3, 0, 5, 4, 5, 6, 1 },
/*[5][5] =*/ { 24, 1, 3, 6, 3, 3, 2, 4, 2, 2, 6, 5, 6, 6, 4, 1, 4, 4, 5, 3, 5, 5, 1, 2, 1 },
/*[5][6] =*/ { 14, 1, 4, 5, 0, 2, 3, 6, 6, 3, 2, 0, 5, 4, 1 }
},
{
/*[6][0] =*/ { 2, 1, 6 },
/*[6][1] =*/ { 16, 1, 0, 1, 6, 2, 4, 5, 6, 6, 0, 6, 1, 5, 3, 2, 1 },
/*[6][2] =*/ { 1, 1 },
/*[6][3] =*/ { 24, 1, 2, 1, 5, 5, 3, 5, 4, 4, 1, 4, 6, 6, 5, 6, 2, 2, 4, 2, 3, 3, 6, 3, 1 },
/*[6][4] =*/ { 48, 1, 3, 1, 4, 0, 2, 5, 3, 3, 2, 3, 5, 0, 6, 1, 2, 2, 6, 2, 1, 0, 4, 3, 6, 6, 4, 6, 3, 0, 5, 2, 4, 4, 5, 4, 2, 0, 1, 6, 5, 5, 1, 5, 6, 0, 3, 4, 1 },
/*[6][5] =*/ { 42, 1, 4, 1, 5, 0, 4, 3, 3, 5, 3, 1, 0, 5, 2, 2, 1, 2, 3, 0, 1, 6, 6, 3, 6, 2, 0, 3, 4, 4, 2, 4, 6, 0, 2, 5, 5, 6, 5, 4, 0, 6, 1 },
/*[6][6] =*/ { 3, 1, 5, 1 }
}
};
if( n <= 2 )
return 1;
if( a%7==0 && b%7==0 )
return 0;
const unsigned* buf = maps[a%7][b%7];
return buf[1+(n-2)%buf[0]];
}