原文在这里:http://www.interviewstreet.com/recruit/challenges/solve/4e1491425cf10/4e14a0058572a/,需要gmail账户登录。是今天一个朋友来访告诉我的(小子我很孤陋寡闻……)。

  懒得看英文的看此处,题目要求是有公式 1/x + 1/y = 1/N!,x,y都是正整数,1 <= N <= 10^6 ,求满足条件的(x, y)个数。

  公式可以化为:y * (N! / x) + N! = y,所以y > N!,而且由于x,y对称,所以x > N!

  由原来公式可以知道(2N!, 2N!)是肯定存在的一对,而且x,y对称,那么如果x落在区间(N!, 2N!),y必然落在区间(2N!, +∞)。

  有了上面的推断,容我有空再想想应该怎么算吧,这哪里是算法题?分明是数学题么。实际是求函数1/x + 1/y = 1/N!在图像上和整数的交点。

我们可以进入如下推导:

  令x ∈(N!, 2*N!),假设x = N! + z,那么有z∈(0, N!),可以把原式转换成如下形式:

  1/(N! + z) + 1/y = 1/N!

  可以进一步转换为:

  y = (N! * N!) / z + N!

  到这一步,就很明了了,z是任意一个能被N! * N!整除的数。求N! * N!所有能整除的数字么,就是1 - N共N个数字,每数字有两个的情况下,2N个数字的排列组合了,这个排列组合,还要小于2 * N!,那么这个问题的时间复杂度应该是穷举算法能够解决的问题了。比如,令N=3,那么可以求出z能够取的值是3! * 3!能整除的数字而且小于2 * 3!,就是36所有能整除的数字而且小于12,但是包括{1, 2, 3, 4, 6, 9, 12},对于的(x, y)就是{(7, 42), (8, 24), (9, 18), (12, 12)}。具体的代码,容我有空再给出(这个代码已经不重要了吧?)

原文来自我的教育网博客