HDU 2281 pell方程

题意:给出N找出最大的n满足n<=N;

#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAX=2;
const long long oo=1e18;
typedef struct
{
    long long m[MAX][MAX];
} Matrix;
Matrix I= {1,0,
           0,1
          };
Matrix P,data;
Matrix matrixmul(Matrix a,Matrix b) //矩阵乘法
{
    int i,j,k;
    Matrix c;
    for (i = 0 ; i < MAX; i++)
        for (j = 0; j < MAX; j++)
        {
            c.m[i][j] = 0;
            for (k=0; k<MAX; k++)
                c.m[i][j]+=a.m[i][k]*b.m[k][j];
            c.m[i][j];
        }
    return c;
}
int main()
{
    long long ans[50][2];
    P.m[0][0]=P.m[1][1]=7;
    P.m[0][1]=48,P.m[1][0]=1;
    data=I;
    ans[0][0]=ans[0][1]=1;
    int num=1;
    for(int i=1; i<50; i++)
    {
        data=matrixmul(data,P);
        long long nowx=data.m[0][0]*7+data.m[0][1],nowy=data.m[1][0]*7+data.m[1][1];
        if((nowx-3)%4==0)
            ans[num][0]=(nowx-3)/4,ans[num][1]=nowy,num++;
        if(ans[num-1][0]>oo)
            break;
    }
    long long n;
    while(~scanf("%I64d",&n),n)
        for(int i=0; i<8; i++)
            if(ans[i][0]>n||i==7)
            {
                printf("%I64d %I64d\n",i==7?ans[7][0]:ans[i-1][0],i==7?ans[7][1]:ans[i-1][1]);
                break;
            }
    return 0;
}
时间: 2024-08-22 15:16:18

HDU 2281 pell方程的相关文章

HDU 3292 pell方程

题意:求x^2+n*y^2=1 按x排序第k大的解. 题目就是求佩尔方程,用矩阵连乘的方法,当n为完全平方数的时候无解. 如果我们求出Pell方程的最小正整数解后,就可以根据递推式求出所有的解. 则根据上式我们可以构造矩阵,然后就可以快速幂了. 这样就可以求出第k大的解. HDU3292题就要用到上面的矩阵方法求第k大的解. #include <iostream> #include<cstdio> #include<cstring> #include<algori

HDU 2281 Square Number: Pell方程及数论

http://acm.hdu.edu.cn/showproblem.php?pid=2281 思路: 原式化为:m^2-48x^2=1,(m=4n+3) 立即得到最小正整数解:m1=7,x1=1 后面就和uva 138一样了. 注意:得到mk后还要判断(mk-3)%4==0才能加到n中,详见代码. 完整代码: 01./*31ms,276KB*/ 02. 03.#include<cstdio> 04.#include<vector> 05.using namespace std; 0

POJ 2427 pell方程

题意:求解x^2-n*y^2=1的最小正整数解. java大数模板. import java.math.BigInteger; import java.util.Scanner; public class Main { public static void solve(int n) { BigInteger N, p1, p2, q1, q2, a0, a1, a2, g1, g2, h1, h2,p,q; g1 = q2 = p1 = BigInteger.ZERO; h1 = q1 = p2

hdu 1299 Diophantus of Alexandria

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1299 题目大意: 求方程1/x+1/y=1/n的解的个数 分析: 1/x+1/y = 1/n 设y = n + k; ==>1/x + 1/(n+k)=1/n; ==>x = n^2/k + n; 因为x为整数,k就是n^2的约数. /*Heal The World There's a place in your heart And I know that it is love And this

hdu 3466 Proud Merchants(0/1背包)

点击打开链接hdu 3466 思路: 0/1背包 分析: 1 这一题和"hdu2546 饭卡"有点像,但是又有不同,不同的是这一题每一个物品都有一个限制的值Q[i],求最大的价值 2 题目明确提到每一种物品只能卖一次或这不卖,那这明显就是0/1的性质,但是现在多了一个条件钱不能少于Q[i].这边的话我各种YY无果之后,果断看了题解,发现是要按照q-p排序,然后再做dp. 3 经过一番的YY之后,我明白了为什么按照q-p是正确的.我们都知道dp有一个很重要的特点就是无后效性,如果没有金钱

【HDU 5572 An Easy Physics Problem】计算几何基础

2015上海区域赛现场赛第5题. 题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5572 题意:在平面上,已知圆(O, R),点B.A(均在圆外),向量V. 一个小球从A出发,沿速度向量V匀速前进,若撞到圆则发生弹性碰撞,沿"反射方向"继续匀速前进.问A点能否经过B点. 题目读懂了,把所有情况都考虑全,流程图就出来了,然后直接套模版即可(注意有些功能可剪裁~)   我的第一道计算几何,WA了一个星期啊...原因有姿势不对,精度不对,还有输

hdu 2639 Bone Collector II (0/1背包)

点击打开链接hdu 2639 思路: 0/1背包求第k优解 分析: 1 其基本思想是,将每个状态都表示成有序队列,将状态转移方程中的 max/min 转 化成有序队列的合并. 2 这里仍然以 01 背包为例讲解一下.    首先看 01 背包求最优解的状态转移方程: F [i, v] = max{F [i − 1, v], F [i − 1, v −Ci ] + Wi }.如果要求第 K 优解,那么状态 F [i, v] 就应该是一个大小为 K 的队列F [i, v, 1 . . . K].其中

HDU 2639(第K大背包)

Bone Collector II Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 917 Accepted Submission(s): 437 Problem Description The title of this problem is familiar,isn't it?yeah,if you had took part in the

hdu 1527

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1527 hint:威佐夫博弈 基本类似于模板 #include <iostream> #include <cmath> #include <cstdio> using namespace std; const double q = (1 + sqrt(5.0)) / 2.0; // 黄金分割数 int Wythoff(int a, int b) { if (a > b)