【题解】Street Numbers [UVA138]

【题解】Street Numbers [UVA138]

传送门:( ext{Street Numbers [UVA138]})

【题目描述】

求满足 (n<m)(sum_{i=1}^{n-1}i=sum_{i=n+1}^{m}i) 的正整数对 (n,m) 。从小到大输出前 (10) 组解,要求输出的每个整数都占 (10) 格宽。

【分析】

被抄代码+抄题解的xxs们气到了,于是写下这篇题解,顺便简单讲一下佩尔方程(好像在 ( ext{OI}) 里运用不多)

佩尔方程是一种不定二次方程,且分为两类,该种方程有无穷多个解 【证明】

【第一类佩尔方程】

形如 (x^2-Dy^x=1) ((Dinmathbb{N^{*}} ext{且为非平方数}))

设它的一组最小正整数解为 (left{egin{array}{c}x=x_0\y=y_0end{array} ight.,) 则其第 (n) 个解满足:(x_n+sqrt{D}y_n=(x_0+sqrt{D}y_0)^{n+1})

(sqrt{D}) 这个东西并不友好,考虑转换成递推式:

[egin{aligned}x_n+sqrt{D}y_n&=(x_0+sqrt{D}y_0)(x_0+sqrt{D}y_0)^n\ &=(x_0+sqrt{D}y_0)(x_{n-1}+sqrt{D}y_{n-1})\ &=(x_0x_{n-1}+Dy_0y_{n-1})+sqrt{D}(x_0y_{n-1}+y_0x_{n-1})end{aligned}]

即可得:(left{egin{array}{c}x_n=x_0x_{n-1}+Dy_0y_{n-1}\y_n=x_0y_{n-1}+y_0x_{n-1}end{array} ight.)

【第二类佩尔方程】

形如 (x^2-Dy^x=-1) ((Dinmathbb{N^{*}} ext{且为非平方数}))

设它的一组最小正整数解为 (left{egin{array}{c}x=x_0\y=y_0end{array} ight.,) 则其第 (n) 个解满足:(x_n+sqrt{D}y_n=(x_0+sqrt{D}y_0)^{2n+1})

求递推式就把右边化成 ((x_0+sqrt{D}y_0)^{2}(x_{n-1}+sqrt{D}y_{n-1})) 再展开,后续推导略。

【求解方法】

第一步是求最小正整数解。可以证明当 (D) 较小时 (x_0,y_0) 也较小,所以直接从小到大暴力枚举即可。算出 (x_0,y_0) 后即可递推得到其他解。

求解佩尔方程通常会以 高精递推/矩阵递推加速 的形式出现(虽然也没多少题)。

回到这题,先化简柿子:(frac{n(n-1)}{2}=frac{m(m+1)}{2}-frac{n(n+1)}{2}Longrightarrow 2n^2=m^2+m),显然和上面的方程没有丝毫关联,我们给两边同乘 (4) 然后配方:(8n^2=4m^2+4mLongrightarrow (2m+1)^{2}-8n^2=1),忽略 (n<m) 的条件,显然为第一类佩尔方程。

瞪眼法暴力枚举法可知其最小解为 (left{egin{array}{c}x_0=3\y_0=1end{array} ight.)

答案为 (left{egin{array}{c}n_i=y_i\m_i=frac{x_i-1}{2}end{array} ight.)

(输出来后发现除了第 (0) 个解以外其他均满足 (n<m)

【Code】

#include<algorithm>
#include<cstring>
#include<cstdio>
#define LL long long
#define Re register int
using namespace std;
const int N=103;
int D,x[N],y[N];
int main(){
    x[0]=3,y[0]=1,D=8;
    for(Re i=1;i<=10;++i)
        x[i]=x[0]*x[i-1]+D*y[0]*y[i-1],
        y[i]=x[0]*y[i-1]+y[0]*x[i-1];
    for(Re i=1;i<=10;++i)//因为要满足n<m,(x0,y0)被舍去了 
        printf("%10d%10d
",y[i],x[i]-1>>1);
}
原文地址:https://www.cnblogs.com/Xing-Ling/p/13289077.html