Analysis
首先分析题目,要求求对于给定 n n n,在 [ 1 , n ] [1, n] [1,n]范围内满足 x y + 1 ∣ x 2 + y 2 xy + 1 | x^2 + y^2 xy+1∣x2+y2的解的个数。
首先考虑合法解:要使 x y + 1 ∣ x 2 + y 2 xy + 1 | x^2 + y^2 xy+1∣x2+y2,则应满足 x 2 + y 2 = k ( x y + 1 ) x^2 + y^2 = k(xy + 1) x2+y2=k(xy+1),则: x 2 + y 2 = k ( x y + 1 ) x 2 + y 2 − k x y − k = 0 \begin{aligned} x^2 + y^2 = k(xy + 1) \\ x^2 +y^2 - kxy - k = 0 \end{aligned} x2+y2=k(xy+1)x2+y2−kxy−k=0 由题意可知 1 ≤ x ≤ y ≤ n 1 \leq x \leq y \leq n 1≤x≤y≤n,则假设 ( x 0 , y 0 ) (x_0, y_0) (x0,y0)为原方程的一组合法解,那么对于方程: x 2 + y 0 2 − k x y 0 − k = 0 x^2 +y_0^2 - kxy_0 - k = 0 x2+y02−kxy0−k=0 显然有一根为 x 0 x_0 x0,此时上述方程属于一元二次方程,由韦达定理可知: x 0 + x 1 = k y 0 , x 0 x 1 = y 0 2 − k x 1 = k y 0 − x 0 = y 0 2 − k x 0 \begin{aligned} &x_0 + x_1 = ky_0,x_0x_1 = y_0^2 - k \\ &x_1 = ky_0 - x_0 = \frac{y_0^2 - k}{x_0} \end{aligned} x0+x1=ky0,x0x1=y02−kx1=ky0−x0=x0y02−k 很显然, ( k y 0 − x 0 , y 0 ) (ky_0 - x_0, y_0) (ky0−x0,y0)为满足原方程的一组解。且 k y 0 − x 0 ≥ 0 ky_0 - x_0 \geq 0 ky0−x0≥0,那么最小的一组整数解满足 k y − x = 0 ky - x = 0 ky−x=0
那么打表可以发现,每条解(自下述 1 1 1形式开始向后)呈现以下规律:
- x 0 = a 3 x_0 = a^3 x0=a3
- s i + 1 = s i × a 2 − s i − 1 s_{i + 1} = s_i \times a^2 - s_{i- 1} si+1=si×a2−si−1
那么预处理全部答案,二分查找询问即可。
#include
#define int long long
#define mod 1000000007
#define N 100005
using namespace std;
int n, d, a1, a2, t, sum, tot;
int a[1000] = {8, 30};
struct node{
__int128 x, y;
bool operator
关注
打赏
- 回坑记之或许是退役赛季?
- [LCT刷题] P1501 [国家集训队]Tree II
- [LCT刷题] P2147 洞穴勘测
- 2022-2023 ICPC Brazil Subregional Programming Contest VP记录
- [线段树套单调栈] 2019-2020 ICPC Asia Hong Kong Regional Contest H.[Hold the Line]
- The 2021 ICPC Asia Nanjing Regional Contest E.Paimon Segment Tree 区间合并线段树/维护矩阵乘法
- CF580E - Kefa and Watch 线段树维护哈希
- HDU5869 Different GCD Subarray Query 离线查询/区间贡献
- 27.CF1004F Sonya and Bitwise OR 区间合并线段树
- 26.CF1000F One Occurrence