HDU 2281 Square Number (Pell方程&数论)

http://acm.hdu.edu.cn/showproblem.php?pid=2281


思路:

原式化为:m^2-48x^2=1,(m=4n+3)

立即得到最小正整数解:m1=7,x1=1

后面就和uva 138一样了。

注意:得到mk后还要判断(mk-3)%4==0才能加到n中,详见代码。


完整代码:

/*31ms,276KB*/

#include
#include
using namespace std;
typedef __int64 ll;
const ll maxn = 1e18;

ll n[20], x[20];
vector nn, xx;

int main()
{
	int i;
	long long N;
	n[0] = 7LL, x[0] = 1LL;
	nn.push_back(1LL), xx.push_back(1LL);
	for (i = 1;; ++i)
	{
		n[i] = 7LL * n[i - 1] + 48LL * x[i - 1];
		x[i] = n[i - 1] + 7LL * x[i - 1];
		if (n[i] < 0) break;
		if ((n[i] - 3) % 4 == 0) nn.push_back((n[i] - 3) / 4), xx.push_back(x[i]);
	}
	nn.push_back(maxn + 5);
	while (scanf("%I64d", &N), N)
	{
		for (i = 0; i < nn.size(); ++i)
		{
			if (N < nn[i])
			{
				printf("%I64d %I64d\n", nn[i - 1], xx[i - 1]);
				break;
			}
		}
	}
	return 0;
}

你可能感兴趣的:(acm之路--数学,数论,HDU)