大意不再赘述。
思路:
佩尔方程的求解。
佩尔方程:
xn = [x1 dy1] ^n-1 x1
yn = [y1 x1 ] y1
佩尔方程的递推公式由此矩阵给出。
至于x1,y1的话是方程的最小特解。
如何求最小特解呢?x^2 - d*y^2 = 1,即x = sqrt(d*y*y+1.0),令y = 1,求得并检验x此时是否满足x^2 - d*y^2 = 1;如果满足,那么(x,y)即为所求,否则y = y+1,并继续检验。
回到该题,要使1+2+3+...+n = (n+1) +... + m,有n(n+1)/2 = (m-n)(m-n+1)/2,即(2*m+1)^2 - 8*n^2 = 1,令x = 2*m+1,y = n,有x^2 - 8*y^2 = 1,这是典型的佩尔方程,求得x1 = 3, y1 = 1,由迭代公式去求接下来的x, y即可。
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
void Search(int &x1, int &y1, int d)
{
int x, y = 1;
for(;;)
{
x = (int)(sqrt(d*y*y + 1.0));
if(x*x - d*y*y == 1) break;
y++;
}
x1 = x, y1 = y;
}
void pel(int x1, int y1, int d)
{
int x, y;
int px = x1, py = y1;
for(int i = 1; i <= 10; i++)
{
x = px*x1 + d*py*y1;
y = py*x1 + px*y1;
printf("%10d%10d\n", y, (x-1)/2);
px = x;
py = y;
}
return ;
}
void solve()
{
int x1, y1;
Search(x1, y1, 8);
pel(x1, y1, 8);
}
int main()
{
solve();
}