如何在不使用模数运算符的情况下计算可整除项的数量?
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
且可被 A
和 B
整除的整数个数。
但是,(int) (N/(A*B))
不会 给你正确的整数计数 ≤ N
并且 可以被 [=15] 整除=] 和 B
.
实际上,您应该将 (int) (N/(A*B))
替换为 (int) (N/lcm(A,B))
以获得正确的结果。这里 lcm(A, B)
returns A
和 B
.
的最小公倍数
要实现lcm(A, B)
功能,只需使用以下公式即可:
lcm(A, B) = A * B / gcd(A, B);
其中 gcd(A, B)
returns A
和 B
的最大公约数,可以通过以下方式高效计算Euclidean Algorithm,这不可避免地涉及使用模数运算符的次数很少(准确地说是 max {log(A), log(B)}
次),因此对您来说应该不会有任何性能问题。
给定三个数字 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
且可被 A
和 B
整除的整数个数。
但是,(int) (N/(A*B))
不会 给你正确的整数计数 ≤ N
并且 可以被 [=15] 整除=] 和 B
.
实际上,您应该将 (int) (N/(A*B))
替换为 (int) (N/lcm(A,B))
以获得正确的结果。这里 lcm(A, B)
returns A
和 B
.
要实现lcm(A, B)
功能,只需使用以下公式即可:
lcm(A, B) = A * B / gcd(A, B);
其中 gcd(A, B)
returns A
和 B
的最大公约数,可以通过以下方式高效计算Euclidean Algorithm,这不可避免地涉及使用模数运算符的次数很少(准确地说是 max {log(A), log(B)}
次),因此对您来说应该不会有任何性能问题。