POJ 2427 Smith's Problem Pell方程
题目链接 : 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*X2 - B*Y2 = 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方程的更多相关文章
- POJ 1320 Street Numbers Pell方程
http://poj.org/problem?id=1320 题意很简单,有序列 1,2,3...(a-1),a,(a+1)...b 要使以a为分界的 前缀和 和 后缀和 相等 求a,b 因为序列很 ...
- hdu3293(pell方程+快速幂)
裸的pell方程. 然后加个快速幂. No more tricks, Mr Nanguo Time Limit: 3000/1000 MS (Java/Others) Memory Limit: ...
- Pell方程及其一般形式
一.Pell方程 形如x^2-dy^2=1的不定方程叫做Pell方程,其中d为正整数,则易得当d是完全平方数的时候这方程无正整数解,所以下面讨论d不是完全平方数的情况. 设Pell方程的最小正整数解为 ...
- POJ.3468 A Simple Problem with Integers(线段树 区间更新 区间查询)
POJ.3468 A Simple Problem with Integers(线段树 区间更新 区间查询) 题意分析 注意一下懒惰标记,数据部分和更新时的数字都要是long long ,别的没什么大 ...
- POJ 1320 Street Numbers 解佩尔方程
传送门 Street Numbers Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 2529 Accepted: 140 ...
- POJ 3468.A Simple Problem with Integers-线段树(成段增减、区间查询求和)
POJ 3468.A Simple Problem with Integers 这个题就是成段的增减以及区间查询求和操作. 代码: #include<iostream> #include& ...
- poj 3468 A Simple Problem with Integers 【线段树-成段更新】
题目:id=3468" target="_blank">poj 3468 A Simple Problem with Integers 题意:给出n个数.两种操作 ...
- 线段树(成段更新) POJ 3468 A Simple Problem with Integers
题目传送门 /* 线段树-成段更新:裸题,成段增减,区间求和 注意:开long long:) */ #include <cstdio> #include <iostream> ...
- POJ 1152 An Easy Problem! (取模运算性质)
题目链接:POJ 1152 An Easy Problem! 题意:求一个N进制的数R.保证R能被(N-1)整除时最小的N. 第一反应是暴力.N的大小0到62.发现当中将N进制话成10进制时,数据会溢 ...
随机推荐
- 《Java设计模式》之装饰模式
装饰模式(Decorator) 1. 装饰模式(Decorator)的定义:又名包装(Wrapper)模式.装饰模式以对client透明的方式扩展对象的功能,是继承关系的一个替代方案. 2. ...
- Id选择器和Class选择器
http://www.runoob.com/css/css-id-class.html http://www.w3school.com.cn/css/css_syntax_id_selector.as ...
- apiCloud如何打开新页面的同时,关掉当前页
方法很多,只要不同时open.close都可行.给你一个简单的方式: api.addEventListener({ name:'viewdisappear' },function(){ api.clo ...
- poj--1149--PIGS(最大流经典建图)
PIGS Time Limit: 1000MS Memory Limit: 10000KB 64bit IO Format: %I64d & %I64u Submit Status D ...
- dubbo+zookeeper+springMVC +maven
pom: <dependency> <groupId>com.github.sgroschupf</grou ...
- css3 边框阴影效果
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Java:网络传输
网络以字节码传输 String s = "我恨你"; //转成字节: byte[] brr = s.getBytes();//gbk //iE:utf-8 String s1 = ...
- Flex之柱状图实例
Flex之柱状图实例 <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns ...
- HDU 4971 A simple brute force problem.
A simple brute force problem. Time Limit: 1000ms Memory Limit: 65536KB This problem will be judged o ...
- Android捕获View焦点事件,LinearLayout结合HorizontalScrollView实现ViewPgaer和选项卡Tabs联动
<Android捕获View焦点事件,LinearLayout结合HorizontalScrollView实现ViewPgaer和选项卡Tabs联动.> 如图: package zh ...