C#
var A = new int[] {5, 7, 1, 3, 5, 12, 7, 10};
var B = new int[] {7, 2, 4, 1, 2, 7, 8};
(from a in A
from b in B
orderby a * b descending, a descending, b descending
select new { a, b }).ToList().ForEach(i => Console.WriteLine("{0}x{1}={2}", i.a, i.b, i.a * i.b));
There, that's fairly elegant - just create a cartesian product of the two arrays sorting by first the product descending, then by the item in A, then finally by the item in B.
It handles singles and duplicates, it handles cross-join duplicates too - which you didn't ask for.
Which is roughly equivalent to:
var A = new int[] {5, 7, 1, 3, 5, 12, 7, 10};
var B = new int[] {7, 2, 4, 1, 2, 7, 8};
var C = from a in A
from b in B
orderby a * b descending
select new { a, b };
foreach(var i in C)
{
Console.WriteLine("{0}x{1}={2}", i.a, i.b, i.a * i.b);
}