#include <iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
const int maxn=4;
const int M=8191;
struct matrax
{
int m[maxn][maxn];
}pre,d;
int n,x,y,D;
void mysearch()
{
y=1;
while(1){
x=(long long )sqrt(D*y*y+1);
if(x*x-D*y*y==1)
break;
y++;
}
}
void init()
{
d.m[0][0]=x%M;
d.m[0][1]=D*y%M;
d.m[1][0]=y%M;
d.m[1][1]=x%M;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
pre.m[i][j]=(i==j);
}
matrax muilt(matrax a,matrax b)
{
matrax c;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++){
c.m[i][j]=0;
for(int k=0;k<n;k++)
c.m[i][j]+=a.m[i][k]*b.m[k][j];
c.m[i][j]%=M;
}
return c;
}
matrax power(int k)
{
matrax p,ans=pre;
p=d;
while(k){
if(k&1){
ans=muilt(ans,p);
k--;
}
k>>=1;
p=muilt(p,p);
}
return ans;
}
int main()
{
int K;
while(cin>>D>>K){
int ad=sqrt(D*1.0);
if(ad*ad==D){
printf("No answers can meet such conditions\n");
continue;
}
mysearch();
n=2;
init();
d=power(K-1);
x=(d.m[0][0]*x%M+d.m[0][1]*y%M)%M;
printf("%d\n",x);
}
return 0;
}
HDU 3292 佩尔方程(矩阵表示)
最新推荐文章于 2020-02-03 21:58:59 发布