题目链接 :  http://poj.org/problem?id=2427

PELL方程几个学习的网址:

http://mathworld.wolfram.com/PellEquation.html     wolfram的讲解

http://hi.baidu.com/aekdycoin/item/a45f7c37850e5b9db80c03d1     AC神的博客

http://blog.csdn.net/acdreamers/article/details/8529686    acdreamer的博客  (从这里知道的思路...

Pell方程 :  形如 X2 - D*Y2 = 1 的式子我们称作Pell方程 (D为正整数)

Pell方程的推广形式 :  形如A*X- B*Y= C 的式子我们称作Pell方程的推广 (其中 A,B,C均为正整数)

本题是Pell方程的最小根

按照Pell方程连分数解法的定义 , 只需要求出sqrt(N)的连分数即可

于是我苦翻了一天数论书看懂了连分数的性质...公式在初等数论及其应用 P370

所以我们只需要一直求连分数sqrt(N)的 收敛子p/q p,q就是最后我们要求的答案

但是这题不需要化成连分数的向量形式即 [a1;a2,a3...] , 因为double精度误差很大,BigDecimal很不方便 而且 找循环节很复杂

这题只需要用下面的定理即可 ...本题中 P0 = 0,Q0 = 1  ,这里因为求出Pk,Qk会非常大 , 所以用Java的BigInteger实现更方便

import java.util.*;
import java.io.BufferedInputStream;
import java.math.*;
public class Main {
public static void main(String[] args) {
Scanner cin = new Scanner(new BufferedInputStream(System.in));
while(cin.hasNext()){
int n = cin.nextInt();
double p = Math.sqrt(n);
int k = (int)p;
if(k == p) {
System.out.println("No solution!");
continue;
}else {
/*
* 逐项求 sqrt(D) 的连分数 用p/q表示
* 公式在初等数论及其应用P370
*/
BigInteger x = BigInteger.ONE; //p
BigInteger y = BigInteger.ONE; //q
BigInteger a,N,P1,Q1,P2,Q2,ak,p1,q1,p2,q2;
q1 = p2 = P1 = BigInteger.ZERO;
p1 = q2 = Q1 = BigInteger.ONE;
N = BigInteger.valueOf(n); // N = n;
a = BigInteger.valueOf(k); // a = [sqrt(n)]
ak = a; //ak
while(!x.multiply(x).subtract(N.multiply(y).multiply(y)).equals(BigInteger.ONE)){
x = ak.multiply(p1).add(p2); // p[k] = ak * p[k-1] + p[k-2]
y = ak.multiply(q1).add(q2); // q[k] = ak * q[k-1] + q[k-2]
P2 = ak.multiply(Q1).subtract(P1); //P2=P[k+1];
Q2 = N.subtract(P2.multiply(P2)).divide(Q1); //Q2=Q[k+1];
ak = P2.add(a).divide(Q2); //ak P1 = P2;
Q1 = Q2; p2 = p1;
p1 = x;
q2 = q1;
q1 = y;
}
System.out.println(x+" "+y);
}
}
}
}

POJ 2427 Smith's Problem Pell方程的更多相关文章

  1. POJ 1320 Street Numbers Pell方程

    http://poj.org/problem?id=1320 题意很简单,有序列 1,2,3...(a-1),a,(a+1)...b  要使以a为分界的 前缀和 和 后缀和 相等 求a,b 因为序列很 ...

  2. hdu3293(pell方程+快速幂)

    裸的pell方程. 然后加个快速幂. No more tricks, Mr Nanguo Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: ...

  3. Pell方程及其一般形式

    一.Pell方程 形如x^2-dy^2=1的不定方程叫做Pell方程,其中d为正整数,则易得当d是完全平方数的时候这方程无正整数解,所以下面讨论d不是完全平方数的情况. 设Pell方程的最小正整数解为 ...

  4. POJ.3468 A Simple Problem with Integers(线段树 区间更新 区间查询)

    POJ.3468 A Simple Problem with Integers(线段树 区间更新 区间查询) 题意分析 注意一下懒惰标记,数据部分和更新时的数字都要是long long ,别的没什么大 ...

  5. POJ 1320 Street Numbers 解佩尔方程

    传送门 Street Numbers Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2529   Accepted: 140 ...

  6. POJ 3468.A Simple Problem with Integers-线段树(成段增减、区间查询求和)

    POJ 3468.A Simple Problem with Integers 这个题就是成段的增减以及区间查询求和操作. 代码: #include<iostream> #include& ...

  7. poj 3468 A Simple Problem with Integers 【线段树-成段更新】

    题目:id=3468" target="_blank">poj 3468 A Simple Problem with Integers 题意:给出n个数.两种操作 ...

  8. 线段树(成段更新) POJ 3468 A Simple Problem with Integers

    题目传送门 /* 线段树-成段更新:裸题,成段增减,区间求和 注意:开long long:) */ #include <cstdio> #include <iostream> ...

  9. POJ 1152 An Easy Problem! (取模运算性质)

    题目链接:POJ 1152 An Easy Problem! 题意:求一个N进制的数R.保证R能被(N-1)整除时最小的N. 第一反应是暴力.N的大小0到62.发现当中将N进制话成10进制时,数据会溢 ...

随机推荐

  1. iOS 实现QQ界面

    应师傅要求编写个QQ界面来不吝赐教下我的代码问题. 编写个QQ界面.有三个组,每一个组有人.并显示在线不在线. 先看一下效果图 这里省了事由于我的图片仅仅用了一张.假设要依据人的不同设置,仅仅要在ce ...

  2. PHP开发环境&amp;MySQL下载安装及配置流程

    PHP开发环境&MySQL下载安装及配置流程 因工作须要,从0開始学PHP,前几天看完视频教程后開始搞开发环境,到今天才好.这里把安装配置流程梳理一下分享出来. 一.概述 要搭建一个开发环境无 ...

  3. Highcharts图表插件的简单使用说明

    Highcharts图表控件是眼下使用最为广泛的图表控件.本文将从零開始逐步为你介绍Highcharts图表控件. 通过本文.你将学会怎样配置Highcharts以及动态生成Highchart图表. ...

  4. JNI学习积累之三 ---- 操作JNI函数以及复杂对象传递

    本文原创,转载请注明出处:http://blog.csdn.NET/qinjuning 在掌握了JNI函数的使用和相关类型的映射后,以及知晓何利用javah工具生成对应的jni函数以及如何生成动态 链 ...

  5. 125.C++输入小结

    #include <iostream> #include <iomanip> #include <cstring> #include <cstdlib> ...

  6. 深入理解Android(5)——从MediaScanner分析Android中的JNI

    前面几篇介绍了Android中的JNI和基本用法,这一篇我们通过分析Android源代码中的JNI实例,来对JNI部分做一个总结. 一.通向两个不同世界的桥梁 在前面我们说过,JNI就像一个桥梁,将J ...

  7. OPENCV(2) —— Basic Structures(二)

    Mat OpenCV C++ n-dimensional dense array class The class Mat represents an n-dimensional dense numer ...

  8. 在使用FireFox浏览器时,经常打开新标签,页面总是不断自动刷新,解决办法

    可以用如下方法尝试(逐个尝试,看看哪个管用): 1.地址栏输入 about:support,右上角有个翻新Firefox,点击,等待浏览器重启,即可. 2.点击:工具-附加组件,把“火狐主页和标签管理 ...

  9. Linux登陆类型-Linux中如何临时配置IP

    Linux登录: 本地登录,直接在Linux主机上接上键盘显示器,然后输入用户名密码登录 远程登录,通过网络进行登录(需要IP 账户名 密码) windows中远程登录软件有 xshell.putty ...

  10. 无法在WEB服务器上启动调试

    错误:站点使用 IP 地址 Visual Studio 2012 调试器尝试自动附加到正在使用 IP 地址的 Web 应用程序时,会发生该错误. 如果在 IIS 中将“网站标识”更改为“使用特定 IP ...