谁能帮我看看这道算法题的思路哪里错了(要奔溃了T_T)

图片说明
下面是我写的代码。

#include
#include
using namespace std;
bool cmp(long long a, long long b)
{
return a < b;
}
int main()
{
int t;
cin >> t;

while(t--)
{
    long long n, m, k, p;
    cin >> n >> m >> k >> p;
    long long arr[n];

    for(int i = 0; i < n; i++)
    {
        scanf("%lld", &arr[i]);
    }

    sort(arr, arr + n, cmp);
    long long ans = 0;

    for(int i = 0; i + m <= n; i++)
    {
        int left = i, right = i;
        bool flag = false;

        for(int j = i + 1; j < n; j++)
        {
            if(arr[j] - arr[left] <= k && j - i >= m - 1)
            {
                right = j;
                flag = true;
            }
        }

        long long res = 1;

        for(int j = right - left; j >= m; j--)
        {
            res *= j;
        }

        int l = m-1;
        l = l < (right - left) / 2 ? l : right - left - l;

        for(int j = 2; j <= l; j++)
        {
            res /= j;
        }

        if(flag == true)
        {
            ans = (ans + res) % p;
        }
    }

    cout << ans << endl;
}

return 0;

}

for(int i = 0; i + m <= n; i++)
{
int left = i, right = i;
bool flag = false;
//获得与当前位置的数差距不大于K的最远位置的数
for(int j = i + 1; j < n; j++)
{
if(arr[j] - arr[left] <= k && j - i >= m - 1)
{
right = j;
flag = true;
}
}

        long long res = 1;
        //总共有right-left+1个数,第一个数肯定要选,所以共有C(right-left)(m-1)种选择
        for(int j = right - left; j >= m; j--)
        {
            res *= j;
        }

        int l = m-1;
        l = l < (right - left) / 2 ? l : right - left - l;

        for(int j = 2; j <= l; j++)
        {
            res /= j;
        }

        if(flag == true)
        {
            ans = (ans + res) % p;
        }
    }
            稍微写了点注释

数值太大,估计要考虑大数的乘除法