gpt4 book ai didi

c++ - 计算使用长度为 1,2,3,4,......m 的步长到达第 N 步的方法数。(其中 m<=n)

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:28:01 24 4
gpt4 key购买 nike

我得到一个 105 阶的数字 n。我必须使用长度为 1 or 2 or 3 or.....or m 的步长找到从地面到达第 nth 步的方法,这里 m< =n.

由于答案可能太大,因此输出它对 109+7 取模。

#include<iostream.h>
using namespace std;

#define ll long long
#define MOD 1000000007

ll countWays_(ll n, ll m){
ll res[n];
res[0] = 1; res[1] = 1;
for (ll i=2; i<n; i++)
{
res[i] = 0;
for (ll j=1; j<=m && j<=i; j++)
res[i] =(res[i]%MOD+ res[i-j]%MOD)%MOD;
}
return res[n-1];
}

ll countWays(ll s, ll m){
return countWays_(s+1, m);
}
int main (){
scanf("%lld%lld",&s,&m);
printf("%lld\n",countWays(s,m));
return 0;
}

由于复杂度O(m*n),我想降低它。

最佳答案

您的内部循环将 res[i-1] + res[i-2] + ... + res[i-m] 添加到结果中。

sres 中前 i 个元素的总和。然后您可以简单地将 s[i-1] - s[i-m-1] 添加到结果中。

ll countWays_(ll n, ll m){
ll res[n];
res[0] = 1; res[1] = 1;
s[0] = 1; s[1] = 2;
for (ll i=2; i<n; i++)
{
if (i <= m)
res[i] = s[i-1] % MOD;
else
res[i] = (s[i-1] - s[i - m - 1] + MOD) % MOD;
s[i] = (s[i-1] + res[i]) % MOD;
}
return res[n-1];
}

新的复杂度将是 O(n)。您甚至可以将 s 作为数组去掉,并使用单个变量并多做一些簿记工作。

关于c++ - 计算使用长度为 1,2,3,4,......m 的步长到达第 N 步的方法数。(其中 m<=n),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32066912/

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