【问题标题】:Getting WA in SPOJ INCSEQ - Increasing Subsequences [closed]在 SPOJ INCSEQ 中获取 WA - 增加子序列 [关闭]
【发布时间】:2015-05-19 09:12:25
【问题描述】:

我不知道为什么我在第 10 个案例中得到 WA, 我使用了 BIT 和组合。 问题链接:SPOJ INCSEQ

问题详情:给定一个由 N (1 ≤ N ≤ 10,000) 个整数组成的序列 S1, ..., SN (0 ≤ Si

这里是My Code

我认为 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的范围。
  • 数量将是最大 n

标签: c++ c algorithm data-structures


【解决方案1】:

你的combination方法是错误的,因为对于大数,nCr的结果会大于long long范围。

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

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

我们知道

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

由于k 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 操作将确保我们的结果永远不会溢出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多