记录编号 84615 评测结果 AAAAAAAAAA
题目名称 [SPOJ 1739] Pell方程 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 C++ 运行时间 0.004 s
提交时间 2013-12-16 22:27:57 内存使用 0.31 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>
#include<iomanip>
using namespace std;
typedef long long ll;
ll ansp,ansq;
void solve(ll N){
	ll p,lp=1,blp=0;//这一个,前一个和前两个
	ll q,lq=0,blq=1;//这一个,前一个和前两个
	ll a=sqrt((double)N),na;//这一个和下一个
	ll a0=a;
	ll g,lg=0;//这一个和前一个
	ll h,lh=1;//这一个和前一个
	while(true){
		//cout<<"sb"<<endl;
		g=-lg+a*lh;
		h=(N-g*g)/lh;
		na=(g+a0)/h;
		p=a*lp+blp;
		q=a*lq+blq;
		if(p*p-N*q*q==1){
			ansp=p,ansq=q;
			return;
		}
		blp=lp,lp=p;
		blq=lq,lq=q;
		a=na;
		lg=g;
		lh=h;
	}
}
int main(){
	freopen("pell.in","r",stdin);
	freopen("pell.out","w",stdout);
	ll N;
	scanf("%lld",&N);
	solve(N);
	printf("%lld %lld\n",ansp,ansq);
	return 0;
}