use longs due to int overflow