unittest
{
	assert( [ "3", "2 3", "1 1", "3 2" ].parse.expand.solve == 10 );
	assert( [ "4", "1 1", "1 1", "1 5", "1 100" ].parse.expand.solve == 101 );
	assert( [ "5", "3 10", "48 17", "31 199", "231 23", "3 2" ].parse.expand.solve == 6930 );
}



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 n = input.front.to!( long );
	auto tas = new long[][]( n, 2 );
	foreach( ref ta; tas )
	{
		input.popFront;
		ta = input.front.split.to!( long[] );
	}
	return tuple( tas );
}

auto solve( long[][] tas )
{
	auto tv = 1L;
	auto av = 1L;
	
	foreach( ta; tas )
	{
		// tvを一番近いtの倍数に揃える
		if( tv % ta[ 0 ] != 0 ) tv += ta[ 0 ] - tv % ta[ 0 ];
		
		// avを一番近いaの倍数に揃える
		if( av % ta[ 1 ] != 0 ) av += ta[ 1 ] - av % ta[ 1 ];
		
		// tvとavをt:aに揃える
		auto tr = tv / ta[ 0 ];
		auto ar = av / ta[ 1 ];
		if( tr < ar ) tv += ta[ 0 ] * ( ar - tr );
		if( ar < tr ) av += ta[ 1 ] * ( tr - ar );
	}
	
	return tv + av;
}
