Результат $num % 1000000007
всегда будет $num
для всех значений меньше, чем 1000000007. Так что, если все значения в @array
находятся в диапазоне 0 .. 50000, такой расчет является избыточным. Вы должны сделать два шага, а не использовать *=
оператора:
$ans = ($ans % 1000000007) * $_ for @array;
Слово предостережения, хотя. Для любого несвязанного modulo всегда существует риск того, что ваша операция по модулю приведет к нулю, что, конечно же, вызовет полное умножение на нуль. Думаю, вы уже об этом подумали, так как 1000000007, кажется, простое число, но я все равно упомянул об этом.
ETA: Повторное использование промежуточных продуктов:
for (@array) {
$ans *= $_;
print "Before mod: $ans\n";
$ans %= 1000000007;
print "After mod : $ans\n";
}
Обратите внимание, что вам не нужно усугублять операторов здесь.
Если каждое число в '@ array' является <50000, то' $ _% 1000000007' ничего не изменит, так как рассчитывается до умножения. – TLP