unittest
{
	assert( [ "3 3 1 1" ].parse.expand.solve == "100\n010\n001" );
//	assert( [ "1 5 2 0" ].parse.expand.solve == "01010" );
	assert( [ "1 5 2 0" ].parse.expand.solve == "11000" );
	
	assert( [ "4 3 1 2" ].parse.expand.solve == "101\n101\n010\n010" );			// 追加ケース
	assert( [ "4 4 1 2" ].parse.expand.solve == "1000\n0111\n0100\n1011" );		// 追加ケース
	assert( [ "5 4 1 1" ].parse.expand.solve == "No" );							// 追加ケース
}

import std.algorithm;
import std.conv;
import std.range;
import std.stdio;
import std.typecons;

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

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

auto solve( long h, long w, long a, long b )
{
	auto ass = filla( h, w, a, b );
	if( ass ) return ass.join( "\n" );
	
	auto bss = fillb( h, w, a, b );
	if( bss ) return bss.join( "\n" );
	
	auto rss = fillr( h, w, a, b );
	if( rss ) return rss.join( "\n" );
	
	return "No".dup;
}

auto filla( long h, long w, long a, long b )
{
	auto mss = new char[][]( h, w );
	foreach( ref ms; mss )
	{
		ms[] = '0';
	}
	
	// 各行のaマス分を、各列均等になるようにずらして塗る
	{
		auto x = 0L;
		for( auto y = 0L; y < h; y++ )
		{
			for( auto i = 0L; i < a; i++, x = ( x + 1 ) % w )
			{
				mss[ y ][ x ] = '1';
			}
		}
	}
	
	// bの条件が満たせているか判定
	for( auto x = 0L; x < w; x++ )
	{
		auto c = 0L;
		for( auto y = 0L; y < h; y++ )
		{
			c += ( mss[ y ][ x ] == '1' );
		}
		if( min( c, h - c ) != b ) return null;
	}
	return mss;
}

auto fillb( long h, long w, long a, long b )
{
	auto mss = new char[][]( h, w );
	foreach( ref ms; mss )
	{
		ms[] = '0';
	}
	
	// 各列のbマス分を、各行均等になるようにずらして塗る
	{
		auto y = 0L;
		for( auto x = 0L; x < w; x++ )
		{
			for( auto i = 0L; i < b; i++, y = ( y + 1 ) % h )
			{
				mss[ y ][ x ] = '1';
			}
		}
	}
	
	// aの条件が満たせているか判定
	for( auto y = 0L; y < h; y++ )
	{
		auto c = 0L;
		for( auto x = 0L; x < w; x++ )
		{
			c += ( mss[ y ][ x ] == '1' );
		}
		if( min( c, w - c ) != a ) return null;
	}
	return mss;
}

auto fillr( long h, long w, long a, long b )
{
	const CS = [ '0', '1' ];
	
	auto mss = new char[][]( h, w );
	foreach( y, ref ms; mss )
	{
		ms[] = CS[ y % 2 ];
	}
	
	// 各行のaマス分を、各列均等になるようにずらして塗る（奇数行は前の行の0と1を逆にしたものにする）
	{
		auto xs = [ 0L, 0L ];
		for( auto y = 0L; y < h; y++ )
		{
			auto e = y % 2;
			for( auto i = 0L; i < a; i++, xs[ e ] = ( xs[ e ] + 1 ) % w )
			{
				mss[ y ][ xs[ e ] ] = CS[ !e ];
			}
		}
	}
	
	// bの条件が満たせているか判定
	for( auto x = 0L; x < w; x++ )
	{
		auto c = 0L;
		for( auto y = 0L; y < h; y++ )
		{
			c += ( mss[ y ][ x ] == '1' );
		}
		if( min( c, h - c ) != b ) return null;
	}
	return mss;
}
