在SPOJ INCSEQ -递增子序列中获取WA

Getting WA in SPOJ INCSEQ - Increasing Subsequences

本文关键字:获取 WA SPOJ INCSEQ      更新时间:2023-10-16

我不知道为什么我在10号收到WA。我用了BIT和Combination。问题链接:SPOJ INCSEQ

问题详细说明:给定N(1≤N≤10,000)个整数序列S1,…, SN(0≤Si <100,000),计算长度为K的S的递增子序列个数(1≤K≤50,K≤N);即k元组的个数i1,…, iK使得1≤i1 <…& lt;iK≤N, Si1 <…& lt;好食。

这是我的代码

我认为nCr使用Mod函数有问题。他们没有给出失败的测试用例,所以我没有任何失败的测试用例。

// Here i compute nCk
unsigned long long combination(ll n,ll k)
{
    unsigned long long ans=1;
    k=k>n-k?n-k:k;
    ll j=1;
    for(; j<=k; j++,n--)
    {
        if(n%j==0)
        {
            ans*=n/j;
        }
        else if(ans%j==0)
        {
            ans=ans/j*n;
        }
        else
        {
            ans=(ans*n)/j;
        }
    }
    return ans%mod;
}

请帮助

您的combination方法是错误的,因为对于较大的数字,nCr的结果将大于long long的范围。

因此,有效地使用模,我们可以避免在这种情况下的溢出

我们知道还有另一种方法来计算nCr

我们知道

nCr = (n - 1)C(r - 1) + (n - 1)Cr

由于k <= 50,且k <= 50很小,我们可以计算组合表c如下:

int[][]c = new int[n + 1][k+1];
c[0][0] = 1;
for (int i = 1; i <= n; i++) {
    c[i][0] = 1;
    if(i <= k)
        c[i][i] = 1;
    for (int j = 1; j <= k; j++) {
        c[i][j] = c[i - 1][j - 1] + c[i - 1][j];
        c[i][j] %= mod;
    }
}

mod操作将确保我们的结果永远不会溢出