正文

POJ2800,Joseph's Problem解题报告2006-07-28 14:48:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/argol/16926.html

分享到:

    题目很简单,你的解答也很简单:    int calc(int n,int k){     int ret = 0,i;    for (i = 1; i <= n; i++)ret += k%i;    return ret;}   可是,它怎么就超时了呢? 注意约束条件: The input file contains n and k(1<= n,k <= 10^9). n的最大值是10^9。。。。你的程序不超时才怪呢? O(n)的算法,还能怎么优化呢? 对给定的K,所求为不大于n的所有正整数除K的余数r1,r2,......,rn的总和。假设它们对应的商为s1,s2,.....,sn. 注意到,商的可能取值只有O(sqrt(n))种情况,对每个可能的商的值,k%i成等差数列。容易看出,此问题的解的时间复杂度不大于O(sqrt(n)). 分析,解决问题    对N,K比较小的情况,写出具体的余数和商数表。   观察,分析这个表格。   现在,你能否为本问题设计出复杂度为O(sqrt(n))的算法?

阅读(6535) | 评论(5)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册