给出三个数字N,A和B.找出1到N范围内的整数如何被A或B整除。我不能使用范围从1到N的模运算符,因为N可以大到10 ^ 12然后我将耗尽分配的时间让程序产生输出。我已经尝试过制定方程式,但无法提出解决方案。
输入约束:=
1<=N<=10^12
1<=A<=10^5
1<=B<=10^5
答案 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)
分别对应N
和A
可分割的整数≤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
次),因此不应该有任何性能问题。