gpt4 book ai didi

c++ - 在 SPOJ INCSEQ 中获取 WA - 增加子序列

转载 作者:行者123 更新时间:2023-11-30 19:16:26 26 4
gpt4 key购买 nike

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

问题详细信息:给定一个由 N (1 ≤ N ≤ 10,000) 个整数组成的序列 S1, ..., SN (0 ≤ Si < 100,000),计算 S 的长度为 K (1 ≤ K ≤ 50且K≤N);即,满足 1 ≤ i1 < ... < iK ≤ N 且 Si1 < ... < SiK 的 K 元组 i1, ..., iK 的数量。

这里是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;
}

请帮忙

最佳答案

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

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

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

我们知道

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

由于 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;
}
}

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

关于c++ - 在 SPOJ INCSEQ 中获取 WA - 增加子序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30321344/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com