Instead of hash join, nested loop join using unique local index with partitions should have performed most major front work before the query. In real process only narrowed partition is searched using local index and return true or false.
Basically hash/hash composite partition on A and hash partition on B and C and create local index on B and C. Use A as leading table and perform parallel as needed. To avoid table structure change try if index partition can be used for the same purpose.