1. 程式人生 > >hdu-6222-佩爾方程 or 規律打表

hdu-6222-佩爾方程 or 規律打表

這個題要說的東西太多了。

1.可以根據題意暴力打表,找出規律,用Java大數打表即可,此處不多說

2.這個題是一個簡單的佩爾方程,這裡說一下方程的幾個特點,不證明

佩爾方程的一般形式為  

其中,d>1且d不是完全平方數,當d為完全平方數時,只有    這一組特解

如果(x1,y1),(x2,y2)為方程的兩組解,那麼(x1*x2+d*y1*y2,  x1*y2+x2*y1)也是方程的一組解

方程解的遞推公示為:x_{n}=x_{n-1}*x_{1}+y_{n-1}*y_{1}*d , y_{n}=x_{n-1}*y_{1}+y_{n-1}*x_{1}

因此可以打表或者矩陣快速冪解決。

3.首先根據題意設a=t-1,b=t,c=t+1,這樣我們可由海倫凱勒公式得到

                           

那麼要想使得s為整數,就要使      等於3乘以一個平方數

所以我們設    x^2=(\frac{t}{2})^2        

於是得到               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;
                }
            }
        }
    }
}