unittest
{
	assert( [ "2 2" ].parse.expand.solve == 8 );
	assert( [ "3 2" ].parse.expand.solve == 12 );
	assert( [ "1 8" ].parse.expand.solve == 0 );
	assert( [ "100000 100000" ].parse.expand.solve == 530123477 );
}



import std.conv;
import std.math;
import std.range;
import std.stdio;
import std.string;
import std.typecons;

void main()
{
	stdin.byLineCopy.parse.expand.solve.writeln;
}

auto parse( Range )( Range input )
if( isInputRange!Range && is( ElementType!Range == string ) )
{
	auto nm = input.front.split.to!( long[] );
	return tuple( nm[ 0 ], nm[ 1 ] );
}

const MOD = pow( 10L, 9 ) + 7;

auto solve( long n, long m )
{
	// 犬と猿の数の差を計算（差が2匹以上だったら交互に並べられない）
	auto d = ( n - m ).abs;
	if( 2 <= d ) return 0;
	
	// 順列を計算
	auto np = permutation( n );
	auto mp = permutation( m );
	
	// 犬と猿の組み合わせを計算
	auto nmp = ( np * mp ) % MOD;
	if( d == 0 ) nmp = ( nmp * 2 ) % MOD;		// 数の差が無い場合、犬が左端のパターンと猿が左端のパターンで2倍になる
	
	return nmp;
}

auto permutation( long x )
{
	static auto caches = [ 0L, 1L ];
	
	if( caches.length <= x )
	{
		auto h = caches.length;
		caches.length = x + 1;
		foreach( i; h .. caches.length )
		{
			caches[ i ] = ( caches[ i - 1 ] * i ) % MOD;
		}
	}
	
	return caches[ x ];
}
