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