原式化为: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; }