#include <iostream>
using namespace std;

template<int RestP> inline
unsigned long long rec( bool omote, bool ura, int k, int N2 )
{
	if( N2-k < RestP )
		return 0;

	unsigned long long sum = rec<RestP>( true, true, k+1, N2 );
	if( omote )    sum += rec<RestP-1>( false, true, k+1, N2 );
	if(  ura  )    sum += rec<RestP-1>( 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;
}