这个题要说的东西太多了。
1.可以根据题意暴力打表,找出规律,用Java大数打表即可,此处不多说
2.这个题是一个简单的佩尔方程,这里说一下方程的几个特点,不证明
佩尔方程的一般形式为
其中,d>1且d不是完全平方数,当d为完全平方数时,只有 这一组特解
如果(x1,y1),(x2,y2)为方程的两组解,那么(x1*x2+d*y1*y2, x1*y2+x2*y1)也是方程的一组解
方程解的递推公示为:
因此可以打表或者矩阵快速幂解决。
关于如何求解佩尔方程的最小特解,可以用连分数法=>https://blog.youkuaiyun.com/wh2124335/article/details/8871535?locationNum=14&fps=1
3.首先根据题意设a=t-1,b=t,c=t+1,这样我们可由海伦凯勒公式得到
那么要想使得s为整数,就要使 等于3乘以一个平方数
所以我们设
于是得到 d=3
根据题意可知最小特解为x=2,y=1,到此为止用Java大数打表即可。
4.大数中用到了compareTo()这个函数,用来比较两个相同类型的数据的,相同返回0,大于返回1,小于返回-1。
PS:第一次用插入公式,好累啊QAQ
import java.math.*;
import java.util.*;
import java.io.*;
public class Main{//Java学的不好,静态函数静态数据都忘了QAQ
static BigInteger x[]=new BigInteger[128];
static BigInteger y[]=new BigInteger[128];
static BigInteger t[]=new BigInteger[128];
static void ini(){
x[1]=BigInteger.valueOf(2);
y[1]=BigInteger.valueOf(1);
t[1]=BigInteger.valueOf(4);
for(int i=2;i<122;i++){
x[i]=x[i-1].multiply(x[1]).add(y[i-1].multiply(BigInteger.valueOf(3)));
y[i]=x[i-1].multiply(y[1]).add(x[1].multiply(y[i-1]));
t[i]=x[i].multiply(BigInteger.valueOf(2));
}
}
public static void main(String[] args){
Scanner in=new Scanner(System.in);
int T=in.nextInt();
BigInteger n;
ini();
while(T!=0){
T--;
n=in.nextBigInteger();//get it
for(int i=1;i<=121;i++){
if(n.compareTo(t[i])!=1){//n小于等于t[i]
System.out.println(t[i]);
break;
}
}
}
}
}