题意的意思就是给你个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;
}
}