欢迎来到北京理工大学第十一届程序设计新生赛!作为北理工的新生,想必大部分同学对魔法(模法)并不是很熟悉,因此接下来将教大家一些基本的魔法技巧,希望你能在本场比赛中用到。
首先,让我们复习一下C语言程序设计的基本知识——基本数据类型能存储的数值范围:
同时,介绍一个基本的标记: $$$x\ {\rm mod}\ y$$$ 表示 $$$x$$$ 除以 $$$y$$$ 的余数,读作 $$$x$$$ 模 $$$y$$$ 。在 C/C++ 中,你可以使用 $$$a \% b$$$ 求出 $$$a$$$ 除以 $$$b$$$ 的余数。
对于任意的正整数 $$$x,y,p$$$ ,以下公式总是成立:
因此,如果你试图求一个很大的数字除以 $$$p$$$ 的余数,你可以放心的在过程中的每次运算后都对 $$$p$$$ 取模,以防止数值超出数据类型能够表示的范围。
现在,我们来做一个小练习。给定长度为 $$$n$$$ 的数组 $$$a$$$ ,你需要求出 $$$a$$$ 中所有元素的乘积除以 $$$p$$$ 的余数。
第一行两个整数 $$$n,p$$$ ($$$1 \le n \le 10^5, 1 \le p \le 10^9$$$) ,表示数组 $$$a$$$ 的长度,以及所求答案的除数。
第二行 $$$n$$$ 个整数,第 $$$i$$$ 个整数为 $$$a_i(0 \le a_i \lt p)$$$ ,表示数组中的第 $$$i$$$ 个元素。
输出一行一个整数,表示数组 $$$a$$$ 中所有元素的乘积除以 $$$p$$$ 的余数。
3 2035 2023 6 3
1819
3 1000000000 999999999 999999998 999999997
999999994
在样例 $$$1$$$ 中,$$$2023 \times 6 \times 3 = 36414$$$ ,$$$36414 \div 2035 = 17 \cdots 1819$$$ ,因此你需要输出 $$$1819$$$ 。
在样例 $$$2$$$ 中,两个数的乘积会超出 int 类型的范围,因此你应该使用 long long 类型。同时,三个数的乘积超出了 long long 类型的表示范围,因此你需要在每次乘完后,把答案对 1000000000 取模。如果你的程序输出了 '-957777926' ,说明你没有使用 long long 类型计算乘积。如果你的程序输出了 '265065466' ,说明你没有在计算过程中及时对结果取模,导致了 long long 类型的溢出。
| Название |
|---|


