題意的意思就是給你個N,K;
求第K小的X,滿足(X,Y要爲正整數);
顯然這是一個佩爾方程。
定義:若一個不定方程具有這樣的形式:
則稱此二元二次不定方程爲佩爾方程.
在整數域解中
(1)爲完全平方數時
則原式化爲
即
顯然
要使等式成立,只有|
即只有解
(2)爲非平方數
若有兩組解()()
則
即
左右邊加上等式仍成立
所以
所以
回到本題
都必須是正整數,所以我們要暴力求出一組最小特組
ll y=1,x;
while(1)
{
x=sqrt(n*y*y+1);
if(x*x-n*y*y==1)break;
y++;
}
則
由矩陣快速冪求即可
#include<bits/stdc++.h>
#define ll long long
#define endl '\n'
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define per(i,r,l) for(int i=r;i>=l;i--)
const int MX=4e2+7;
const int mod=8191;
using namespace std;
int p[MX],k[MX];
const int m=2;
ll qpow(ll a,ll b,ll MOD=mod){for(ll ans=1;;a=a*a%MOD,b>>=1){if(b&1)ans=ans*a%MOD;if(!b)return ans;}}
ll inv(ll a,ll MOD=mod){return qpow(a,MOD-2,MOD);}
ll __gcd(ll a,ll b){return a*b/__gcd(a,b);}
ll a[m][m],b[m][m];
void mul(ll a[m][m],ll b[m][m])
{
ll c[m][m]={};
for(int i=0;i<m;i++)
{
for(int j=0;j<m;j++)
{
for(int k=0;k<m;k++)
c[i][j]=(c[i][j]+b[i][k]*a[k][j])%mod;
}
}
memcpy(a,c,sizeof c);
}
int main()
{
ios::sync_with_stdio(0),cin.tie(0);
ll n,k;
while(cin>>n>>k){
int m=sqrt(n+0.5);
if(m*m==n||k<=0){
cout<<"No answers can meet such conditions"<<endl;
continue;
}
ll y=1,x;
while(1)
{
x=sqrt(n*y*y+1);
if(x*x-n*y*y==1)break;
y++;
}
a[0][0]=x;
a[0][1]=n*y%mod;
a[1][0]=y;
a[1][1]=x;
b[0][0]=x;
b[1][0]=y;
k--;
while(k)
{
if(k&1)
mul(b,a);
mul(a,a);
k>>=1;
}
cout<<b[0][0]<<endl;
}
}