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

来源:互联网 发布:淘宝网手机网页版 编辑:程序博客网 时间:2024/05/18 04:25

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<cstdio>#include<vector>using namespace std;typedef __int64 ll;const ll maxn = 1e18;ll n[20], x[20];vector<ll> 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;}

原创粉丝点击