C. Kuroni and Impossible Calculation(思维,数C论)
题目链接:查看原文
题目大意:第一行给出n,m两个数。第二行给出n个数ai,i从1~n 。求|ai - aj|(i从1 ~ n、j从i ~ n,)的乘积对m取余的结果。
解题思路:
- 我们可以发现暴力必定超时,这时我们必须另开捷径,因为ai都是正整数,所以我们可以发现当n>m时,有两种情况,一种是可能存在ai==aj的情况,则此时|ai - aj|为0,最终乘积就一定为0,第二种情况是必定存在ai大于m,并且存在aj ==(ai%m),则此时|ai - aj| % m = 0,最终结果也就为0。
- 当n <= m时,此时数据范围很小,直接暴力,时间复杂度应该是O(n^2)。
AC代码 :
#include <iostream>
#include <algorithm>
using namespace std;
int n, m, ans = 1;
int a[1000010];
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> a[i];
if (n > m) ans = 0;
else {
for (int i = 1; i <= n; i++)
for (int j = i + 1; j <= n; j++)
ans = ans * (abs(a[i] - a[j]) % m) % m;
}
cout << ans << endl;
return 0;
}
(应该存在不用特判的算法,但是我不会TT)