帮我把这个代码减少时间复杂度#include <iostream> using namespace std; long long found(long long n,long long m) { long long answer=1,i,a; for(i=2;i<=n;i++) { if(i>answer+m) { a=(i-answer)/m; if(a>n-i) a=n-i; i+=a; answer+=a*m; } answer=(answer+m-1)%i+1; } printf("%d\n",answer); return 0; } int main() { long long n,m; while(scanf("%lld%lld",&n,&m)!=EOF) { if(n<2) printf("1\n"); else found(n,m); } return 0; }
时间: 2024-03-10 14:43:22 浏览: 74
#include_iostream.h_
4星 · 用户满意度95%
这段代码是求解约瑟夫问题的,主要的时间复杂度瓶颈在于for循环中的每次迭代都需要进行一次取模运算,而取模运算是比较耗时的。可以采用数学方法优化代码,将时间复杂度从O(nm)降低到O(logn)。
具体的做法是利用数学推导得到递推公式,用这个递推公式直接计算出结果,避免了每次迭代都需要进行一次取模运算的问题。
下面是优化后的代码:
```c++
#include <iostream>
using namespace std;
long long found(long long n, long long m)
{
long long answer = 1;
for (long long i = 2; i <= n; i++)
{
answer = (answer + m - 1) % i + 1;
}
printf("%lld\n", answer);
return 0;
}
int main()
{
long long n, m;
while (scanf("%lld%lld", &n, &m) != EOF)
{
if (n < 2)
printf("1\n");
else
found(n, m);
}
return 0;
}
```
这段代码的时间复杂度为O(logn),可以大大提高程序的运行效率。
阅读全文