如何在不使用模运算符的情况下计算可分项的数量?

时间:2015-02-25 17:55:08

标签: algorithm math modulus integer-division

给出三个数字N,A和B.找出1到N范围内的整数如何被A或B整除。我不能使用范围从1到N的模运算符,因为N可以大到10 ^ 12然后我将耗尽分配的时间让程序产生输出。我已经尝试过制定方程式,但无法提出解决方案。

输入约束:=

1<=N<=10^12
1<=A<=10^5
1<=B<=10^5

1 个答案:

答案 0 :(得分:0)

  

我只是想用一些方程来评估这个东西,而不是一个   模数运算符因为程序需要在1内产生结果   秒。我试过这个   counter=(((int)(N/A))+((int)(N/B)))-((int)(N/(A*B)));但它失败了   输入N = 200 A = 20 B = 8

您已经走在正确的轨道上,您的公式表明您正在尝试应用包含 - 排除原则。

(int) (N/A)(int) (N/B)分别对应NA可分割的整数≤B的计数。

但是,(int) (N/(A*B)) 不会为您提供N和{{1}可分割的整数≤A的正确计数}

事实上,您应该将B替换为(int) (N/(A*B))才能获得正确的结果。此处(int) (N/lcm(A,B))会返回{em} lcm(A, B)A最小公倍数。

要实现B功能,您只需使用以下公式:

lcm(A, B)

其中lcm(A, B) = A * B / gcd(A, B); 返回 gcd(A, B)A 最大公约数,并且Euclidean Algorithm可以有效地计算它,这不可避免地涉及使用模数运算符的次数非常少(确切地说B次),因此不应该有任何性能问题。