题解Street Numbers [UVA138]
Posted xing-ling
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题解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}) 这个东西并不友好,考虑转换成递推式:
即可得:(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);
}
以上是关于题解Street Numbers [UVA138]的主要内容,如果未能解决你的问题,请参考以下文章
Colossal Fibonacci Numbers! UVA - 11582
UVA11582 Colossal Fibonacci Numbers!