E Math
题意
求数对 ( x , y ) (x,y) (x,y) 满足 x y + 1 ∣ x 2 + y 2 , 1 ≤ x ≤ y ≤ n xy+1|x^2+y^2,1\leq x\leq y\leq n xy+1∣x2+y2,1≤x≤y≤n
设
a
=
k
,
b
=
k
3
a=k,b=k^3
a=k,b=k3 则有
a
2
+
b
2
=
k
2
+
k
6
=
k
2
(
1
+
k
4
)
=
a
2
(
1
+
a
b
)
⇒
a
2
+
b
2
1
+
a
b
=
a
2
a^2+b^2=k^2+k^6=k^2(1+k^4)=a^2(1+ab)\Rightarrow \frac{a^2+b^2}{1+ab}=a^2
a2+b2=k2+k6=k2(1+k4)=a2(1+ab)⇒1+aba2+b2=a2
要使
a
2
+
b
2
1
+
a
b
\frac{a^2+b^2}{1+ab}
1+aba2+b2 为整数,则可以得到
g
c
d
(
a
,
b
)
gcd(a,b)
gcd(a,b) 为完全平方数,则所有满足条件的数对均属于
{
x
(
n
)
,
x
(
n
+
1
)
,
n
=
1
,
2
,
.
.
.
}
\{x(n),x(n+1),n=1,2,...\}
{x(n),x(n+1),n=1,2,...}
{ x = 0 , x = k , x = k 3 , x = k 5 − k . . . . } \{x=0,x=k,x=k^3,x=k^5-k....\} {x=0,x=k,x=k3,x=k5−k....}
x ( n + 1 ) = k 2 x ( n ) − x ( n − 1 ) x(n+1)=k^2x(n)-x(n-1) x(n+1)=k2x(n)−x(n−1)
那么枚举 k k k 控制 x ( n ) x(n) x(n) 不爆 ll 模拟即可
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int ll
#define rep(i, j, k) for (ll(i) = (j); (i) <= (k); (++i))
typedef long long ll;
typedef vector<ll> vll;
vll pos;
void init() {
int a = 0, b = 0, now = 0;
pos.emplace_back(1);
for (int i = 2; i * i * i <= 1e18; ++i) {
a = i;
b = i * i * i;
pos.emplace_back(b);
if (1e18 / b < i * i)
continue;
now = i * i * b - a;
while (now <= 1e18) {
pos.emplace_back(now);
a = b;
b = now;
if (1e18 / b < i * i)
break;
now = i * i * b - a;
}
}
sort(pos.begin(), pos.end());
}
void solve() {
int n;
cin >> n;
int id = lower_bound(pos.begin(), pos.end(), n) - pos.begin();
if (pos[id] == n)
++id;
cout << id << endl;
}
signed main() {
init();
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
int t;
cin >> t;
while (t--)
solve();
return 0;
}