Ozon Tech Challenge 2020 (Div.1 + Div.2) C - Kuroni and Impossible Calculation (鸽巢原理)

传送门->Kuroni and Impossible Calculation
题意:
n n n个数 a 1 , a 2 , . . . , a n a_1 ,a_2,...,a_n a1,a2,...,an,求 ∏ 1 ≤ i < j ≤ n ∣ a i − a j ∣ \prod_{1\le i1i<jnaiaj % m m m
2 ≤ n ≤ 2 ⋅ 1 0 5 , 1 ≤ m ≤ 1000 2\le n \le 2\cdot 10^5,1\le m \le 1000 2n2105,1m1000

思路:
我们发现 n n n很大,但是 m m m很小
这里我们引入->鸽巢原理详解

整数 a 1 , a 2 , . . . , a n a_1 ,a_2,...,a_n a1,a2,...,an( a i a_i ai不是 m m m的倍数),至少有两个数 a i a_i ai, a j a_j aj除以 m m m后余数相同。
所以当 n ≤ m n \le m nm时,我们直接计算答案即可,记得使用longlong
n ≥ m n \ge m nm时,答案为 0 0 0

#include 

using namespace std;
typedef long long ll;
const int N = 2e5 + 10;

void solved()
{
    int n,m;
    cin >> n >> m;
    int a[n];
    for(int i = 0;i < n;i++)cin >> a[i];
    ll ans = 1;
    if(n <= m)
    for(int i = 0;i < n;i++)
    {
        for(int j = i+1;j < n;j++)
        {
            ans = 1ll * abs(a[j] - a[i]) * ans % m;
        }
    }
    else ans = 0;
    cout << ans % m;
}

int main()
{
#ifdef Online_Judge
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#endif
    int t = 1;
    while(t--)solved();
#ifdef LOCAL
    system("pause");
#endif
    return 0;
}

你可能感兴趣的:(数学)