#include using namespace std; template inline unsigned long long rec( bool omote, bool ura, int k, int N2 ) { if( N2-k < RestP ) return 0; unsigned long long sum = rec( true, true, k+1, N2 ); if( omote ) sum += rec( false, true, k+1, N2 ); if( ura ) sum += rec( true, false, k+1, N2 ); return sum; } template<> inline unsigned long long rec<1>( bool omote, bool ura, int k, int N2 ) { return (N2-k)*2 - !omote - !ura - (ura||N2-k!=1); } unsigned long long solve( unsigned long long N ) { // 16席以下の場合: // 無理です if( N<=16 ) return 0; // 奇数席の場合: // 一人目の配置は N 通り // 一人目固定時の残りの7人の配置は、*:王子 _:空席 として // 「(*_) 7個と (_) N-16個 の並べ方」× 7! == C(N-9,7)×7! 通り if( N%2 ) return N * (N-9)*(N-10)*(N-11)*(N-12)*(N-13)*(N-14)*(N-15); // 偶数席の場合: // 一人目の配置は N 通り // 一人目固定時の残りの7人の配置は… 7! × 探索 // 一人目の席を 0番、以下時計回りに1番、2番、... N-1番、とする // 向かい合う席は組にして考える。(1,1+N/2)番、(2,2+N/2)番、... // (k,k+N/2)番目の席の"表"(kの方)に誰かが座ったら、 // (k+1,k+1+N/2)番目の席の"表"の方は隣になるので座れない。 // "裏"の方でも同じことが言える。 // そこで、次の"表"と"裏"に座れるかどうかを渡しながら再帰的に // 座り方を数えていくことにする。最後の席の"裏" N/2-1+N/2 は // 一人目の隣なので座れないことに注意。という再帰探索です。 else return N * 5040 * rec<7>(false,true,1,N/2); } int main() { for(int N; cin>>N,N; ) cout << solve(N) << endl; }