我尝试自己解决此问题,但找不到任何具有更快时间复杂性的解决方案。
如果您能帮助我,我将不胜感激。
这是问题所在:
考虑所有长度为 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/ 您对改善我的代码时间复杂度有任何建议吗?
答案 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
是质数,因此您可以使用质数属性逐步计算结果。但是我认为这里没有必要。
我不会发布您的答案,因为您需要自己完成大部分工作,但是您应该能够使用此信息正确解决问题。