是平方数时,方程无解,当为非平方数时无穷解.
若得到该方程的最小解,可有递推方程得到.


求最小解用连分数

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;
}