裸的pell方程。 然后加个快速幂.
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 320 Accepted Submission(s): 207
// // main.cpp // hdu3292 // // Created by 陈加寿 on 15/12/1. // Copyright (c) 2015年 陈加寿. All rights reserved. // #include <iostream> #include <string.h> #include <stdlib.h> #include <algorithm> #include <stdio.h> #include <string> #include <math.h> using namespace std; #define MOD 8191 void matrix_mul(long long s[4][4],long long t[4][4]) { long long tmp[4][4]; memset(tmp,0,sizeof(tmp)); for(int i=0;i<2;i++) for(int j=0;j<2;j++) for(int k=0;k<2;k++) tmp[i][j]=(tmp[i][j]+s[i][k]*t[k][j])%MOD; for(int i=0;i<2;i++) for(int j=0;j<2;j++) s[i][j]=tmp[i][j]; } int main(int argc, const char * argv[]) { long long n,k; while(cin>>n>>k) { long long x=sqrt( (double)n ); if(x*x==n) { printf("No answers can meet such conditions\n"); continue; } //然后开始寻找第一个解 long long x0,y0; for(long long i=1;;i++) { x=sqrt((double)(i*i*n+1)); if(x*x==i*i*n+1) { x0=x; y0=i; break; } } long long mat[4][4],ans[4][4]; mat[0][0]=x0; mat[0][1]=y0; mat[1][0]=n*y0; mat[1][1]=x0; memset(ans,0,sizeof(ans)); ans[0][0]=1; ans[1][1]=1; k-=1; while(k) { if(k&1) matrix_mul(ans,mat); k>>=1; matrix_mul(mat,mat); } long long ans1; ans1 = (x0*ans[0][0]+y0*ans[1][0])%MOD; cout<<ans1<<endl; } return 0; }
原文:http://www.cnblogs.com/chenhuan001/p/5010441.html