C. Kuroni and Impossible Calculation

C. Kuroni and Impossible Calculation

  1. 题意

    给出一个数列\(a[]\),以及一个模数\(m\),计算\(∏_{1<=i<j<=n}\)\(∣a[i]−a[j]|\)

    数据范围:\(1<=n<=2∗10^5,1<=m<=1000,0<=a[i]<=10^9\)

  2. 思路

    很容易想到的是\(O(n^2)\)的做法,但是看到n的范围,明显会超时。
    又会看到m的范围,不是一个固定的非常大的质数当作模数,所以m应该是突破口。
    根据m,可以分成两种情况。

    1. \(n<=m\), 这样n的范围小于1000,可以用\(O(n^2)\)解决
    2. \(n>m\),模完m之后最多有m个不同的模数,而数列中的数的个数大于m,一定至少存在两个数,\(a[i]≡a[j]modm\), 那么\(∣a[i]−a[j]∣≡0modm\).
      最终的乘积就是0.
  3. 代码实现

    #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;
    } 

猜你喜欢

转载自www.cnblogs.com/AC-AC/p/12427874.html