hdu-6222-佩爾方程 or 規律打表
阿新 • • 發佈:2019-02-13
這個題要說的東西太多了。
1.可以根據題意暴力打表,找出規律,用Java大數打表即可,此處不多說
2.這個題是一個簡單的佩爾方程,這裡說一下方程的幾個特點,不證明
佩爾方程的一般形式為
其中,d>1且d不是完全平方數,當d為完全平方數時,只有 這一組特解
如果(x1,y1),(x2,y2)為方程的兩組解,那麼(x1*x2+d*y1*y2, x1*y2+x2*y1)也是方程的一組解
方程解的遞推公示為:
因此可以打表或者矩陣快速冪解決。
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; } } } } }