hdu-6222-佩尔方程 or 规律打表

这个题要说的东西太多了。

1.可以根据题意暴力打表,找出规律,用Java大数打表即可,此处不多说

2.这个题是一个简单的佩尔方程,这里说一下方程的几个特点,不证明

佩尔方程的一般形式为  

其中,d>1且d不是完全平方数,当d为完全平方数时,只有    这一组特解

如果(x1,y1),(x2,y2)为方程的两组解,那么(x1*x2+d*y1*y2,  x1*y2+x2*y1)也是方程的一组解

方程解的递推公示为:xn=xn-1*x1+d*yn-1*y1            yn=xn-1*y1+yn-1*x1

因此可以打表或者矩阵快速幂解决。

关于如何求解佩尔方程的最小特解,可以用连分数法=>https://blog.csdn.net/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;
                }
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/alusang/article/details/81266923
今日推荐