所有x且长度为k的非递减序列的总和

时间:2018-12-21 06:53:34

标签: c++

我尝试自己解决此问题,但找不到任何具有更快时间复杂性的解决方案。

如果您能帮助我,我将不胜感激。

这是问题所在:

考虑所有长度为 k sum x 的非递减序列。对于每个序列a1,..,ak,我们计算值a1^m+a2^m+...+ak^m(其中给出m)。

此计算得出的总和mod 1e9+7的总和是多少。限制条件:  1<=n, m<=4096, 1<=k<=n时间限制(2秒),内存限制(256 mb)。

我试图用dp解决它,并将dp [i] [j] [u]定义为长度i和j的和最后一个数字u的答案,并用所有dp [i-1] [ju ] [x]使得x小于u我的部分在O(n ^ 3 * k)中起作用,但是可以通过将部分和为O(n ^ 2 * k)来加以改进,但这也比偷窃要慢得多。由于限制较大,时间限制为(2秒)。 这是我到目前为止实现的: https://pastebin.ubuntu.com/p/Kx3j7WMVSv/ 您对改善我的代码时间复杂度有任何建议吗?

1 个答案:

答案 0 :(得分:1)

您是本网站的新手,所以即使这个问题应该被拒绝(因为没有代码可以向您展示您的所作所为),我还是决定添加一些重要说明,因为我想您可能已经错过了这一部分。

请记住,您不能仅通过尝试计算a1^m+a2^m+...+ak^m然后修改为1e9+7来做到这一点。因为a1^m+a2^m+...+ak^m太大了,无法保存在任何标准数据类型中,所以这可能是这个问题的重点

在这种情况下,您需要使用Modular arithmetic逐步计算结果。例如,这些对您有用:

if a ≡ b (mod n), then if a^2 ≡ b^2 (mod n) and if b^2 ≡ r (mod n) then a^2 ≡ r (mod n)

if a ≡ b (mod n), then if a*a ≡ b*a (mod n)
if a ≡ b (mod n), then if a+k ≡ b+k (mod n)

此外,由于1e9+7是质数,因此您可以使用质数属性逐步计算结果。但是我认为这里没有必要。

我不会发布您的答案,因为您需要自己完成大部分工作,但是您应该能够使用此信息正确解决问题。