当是平方数时,方程无解,当为非平方数时无穷解.
若得到该方程的最小解,可有递推方程得到.
求最小解用连分数
ll a[200000]; bool pell(ll D,ll &x,ll &y){ ll m=(ll)sqrt(0.5+D);double sq=sqrt(D); if(m*m==D)return false; int i=0;a[i++]=m;ll b=m,c=1; double tmp; do{ c=(D-b*b)/c; tmp=(sq+b)/c; a[i++]=(ll)(floor(tmp));b=a[i-1]*c-b; }while(a[i-1]!=2LL*a[0]); ll p=1,q=0; for(int j=i-2;j>=0;j--){ ll t=p;p=q+p*a[j];q=t; } if((i-1)%2==0)x=p,y=q; else x=2LL*p*p+1,y=2LL*p*q; return true; }