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

How to count number of divisible terms without using modulus operator?

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

输入约束:=

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

I just want to use some equation to evaluate this thing rather than a modulus operator because the program needs to produce results within 1 sec. I have tried this counter=(((int)(N/A))+((int)(N/B)))-((int)(N/(A*B))); but it fails for input N=200 A=20 B=8

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

(int) (N/A)(int) (N/B) 分别对应于 ≤ N 且可被 AB 整除的整数个数。

但是,(int) (N/(A*B)) 不会 给你正确的整数计数 ≤ N 并且 可以被 [=15] 整除=] 和 B.

实际上,您应该将 (int) (N/(A*B)) 替换为 (int) (N/lcm(A,B)) 以获得正确的结果。这里 lcm(A, B) returns AB.

的最小公倍数

要实现lcm(A, B)功能,只需使用以下公式即可:

lcm(A, B) = A * B / gcd(A, B);

其中 gcd(A, B) returns AB 的最大公约数,可以通过以下方式高效计算Euclidean Algorithm,这不可避免地涉及使用模数运算符的次数很少(准确地说是 max {log(A), log(B)} 次),因此对您来说应该不会有任何性能问题。