PKU 1320 Street Numbers

大意不再赘述。

思路:

佩尔方程的求解。

佩尔方程:

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();
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值