【发布时间】:2021-08-23 19:07:17
【问题描述】:
给定 N。求所有整数对 x,y 的个数,使得
1<=x, y<=N
and x^2 - y is a perfect square
N 很大,但 O(sqrt(N)) 可以解决这个问题。
我试图解决这个问题,比如让 z^2 成为平方数
x^2 - z^2 = y = (x+z)(x-z)
then let x + z = p and x - z = q;
then x = (p+q)/2 and z = (p-q)/2;
and (p+q)/2<=N;
and p and q should have same parity (both even or odd as (p+q)/2 is integer)
also pq<=N
现在我不知道如何从这里开始 或者告诉我一些其他有效解决这个问题的方法。
【问题讨论】:
-
也许你可以迭代所有的
(x,z),并返回对应的(x,y) = (x, (x+z)*(x-z))? x 从 1 循环到 N,z 从 0 循环到sqrt(x**2 - 1) -
既然有 O(n^2) 个这样的对,你如何期望在不到 O(n^2) 的时间内枚举它们?还是您只想知道有多少这样的对?
-
@ChrisDodd 请注意 O() 表示上限;肯定有少于
n**2对 (x,y) 使得 x**2-y 是一个完美的正方形,并且 1 -
如果去掉 y 上的(上)边界,就会有 (n*n + n)/2 个这样的对(即 O(n^2))。使用 y 的上限,有更少但仍然至少 O(n*sqrt(n))。
-
我投票结束这个问题,因为这是一个数论问题,而不是编程问题。添加 C++ 标签不会改变这一点。
标签: c++ c++17 dynamic-programming mathematical-optimization counting