C. Kuroni and Impossible Calculation
题意
给出一个数列\(a[]\),以及一个模数\(m\),计算\(∏_{1<=i<j<=n}\)\(∣a[i]−a[j]|\)
数据范围:\(1<=n<=2∗10^5,1<=m<=1000,0<=a[i]<=10^9\)
思路
很容易想到的是\(O(n^2)\)的做法,但是看到n的范围,明显会超时。
又会看到m的范围,不是一个固定的非常大的质数当作模数,所以m应该是突破口。
根据m,可以分成两种情况。- \(n<=m\), 这样n的范围小于1000,可以用\(O(n^2)\)解决
- \(n>m\),模完m之后最多有m个不同的模数,而数列中的数的个数大于m,一定至少存在两个数,\(a[i]≡a[j]modm\), 那么\(∣a[i]−a[j]∣≡0modm\).
最终的乘积就是0.
代码实现
#include<bits/stdc++.h> using namespace std; const int maxn = 2e5+10; typedef long long ll; ll a[maxn]; int book[1010]; int main(void){ int n,m; scanf("%d%d",&n,&m); for(int i = 1; i <= n; i++){ scanf("%d",&a[i]); if(book[a[i]%m]++){ printf("0\n"); return 0; } } ll ans = 1; for(int i = 1; i <= n; i++){ for(int j = i+1; j <= n; j++){ ans *= abs(a[i]-a[j]); ans %= m; if(ans==0){ printf("%lld\n",ans); return 0; } } } printf("%lld\n",ans); return 0; }