hdu 3292 No more tricks, Mr Nanguo

原创 2013年12月02日 15:09:55

            佩尔方程+矩阵快速幂。先暴力求出佩尔方程的特解(最小解),然后利用佩尔方程的矩阵递推式,推出第k项。

            

#include<algorithm>
#include<iostream>
#include<cstring>
#include<vector>
#include<cstdio>
#include<cmath>
#include<map>
#define LL long long
#define REP(i, n) for(int i = 0; i < n; i ++)
#define CLR(a, b) memset(a, b, sizeof(a))
using namespace std;
const int N = 2;
const int MOD = 8191;

struct Matrix
{
    int m[N][N];
}per, mul;

int x, y, d;

void search()
{
    y = 1;
    while(true)
    {
        x = sqrt((double)d * y * y + 1);
        if(x * x - d * y * y == 1)
            break;
        y ++;
    }
}

void init()
{
    mul.m[0][0] = x % MOD;
    mul.m[0][1] = d * y % MOD;
    mul.m[1][0] = y % MOD;
    mul.m[1][1] = x % MOD;
    REP(i, 2) REP(j, 2)
        per.m[i][j] = (i == j);
}

Matrix Mul(Matrix a, Matrix b)
{
    Matrix c;
    REP(i, 2) REP(j, 2)
    {
        c.m[i][j] = 0;
        REP(k, 2)
            c.m[i][j] += a.m[i][k] * b.m[k][j];
        c.m[i][j] %= MOD;
    }
    return c;
}

Matrix Pow(Matrix a, int b)
{
    Matrix ret = per;
    while(b)
    {
        if(b & 1)
        {
            ret = Mul(ret, a);
        }
        a = Mul(a, a);
        b >>= 1;
    }
    return ret;
}

int main()
{
    int k, ans;
    while(scanf("%d%d", &d, &k) != EOF)
    {
        int tmp = sqrt(d + 0.0);
        if(tmp * tmp == d)
        {
            puts("No answers can meet such conditions");
            continue;
        }
        search();
        init();
        Matrix ma = Pow(mul, k - 1);
        ans = ma.m[0][0] * x % MOD + ma.m[0][1] % MOD * y % MOD;
        printf("%d\n", ans % MOD);
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。转载请标注:blog.csdn.net/ok_again

相关文章推荐

HDU 3292 No more tricks, Mr Nanguo(佩尔方程)

爆搜最小正整数解,然后利用矩阵快速幂求出方程第k大的解。 代码参考HIT《数论及应用》 #include #include using namespace std; #define mod 819...

HDU 3292(No more tricks, Mr Nanguo 佩尔方程矩阵快速幂求解)

No more tricks, Mr Nanguo Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Jav...

hdu 3292——No more tricks, Mr Nanguo

题目大意:求不定方程x^2-n*y^2=1的第k大的解 思路:

hdu3292

佩尔方程,详见《数论概论》(原书第三版),代码很少,证明很吐血

more .htaccess tips and tricks..

from : http://corz.org/server/tricks/htaccess2.php more clever stuff here redire...

毕达哥拉斯三元组:poj 1305+佩尔方程:poj 1320,hdu 3292(特殊不定方程)

毕达哥拉斯三元组: 正整数x,y,z构成一个本原毕达哥拉斯三元组且y为偶数,当且仅当存在互素的正整数m,n(m>n),其中m为奇数n为偶数,或者n为偶数m为奇数,并且满足:...

[HDU3292] 求第K大数

题目描述  战国时期齐国君主非常喜欢管类乐器,尤其喜欢竽,他有自己的一支奏竽的乐队,其中乐队的人数是一个正方形数(每行每列都有X个人)。每天下午他都会让自己的乐队排成正方形为自己演奏。   国王不知...

HDU 5294 Tricks Device (最大流+最短路)

题目链接:HDU 5294 Tricks Device 题意:n个点,m条边,并且一个人从1走到n只会走1到n的最短路径,问至少破坏几条边使原图的最短路不存在,最多破坏几条边使原图的最短路劲仍存在 ...

HDU 5276 YJC tricks time

Problem Description YJC received a mysterious present. It's a clock and it looks like this.  ...

HDU 5294 Tricks Device (2015 MUT#1 最短路建图+最小割)

【题目链接】:click here~~ 【题目大意】: 给定一个无向图,从起点到终点,只有走最短路,才能在规定时限内到达,问最少去掉几条边使不能到达,最多去掉几条边仍能到达 【思路】最短路:寻找道路...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hdu 3292 No more tricks, Mr Nanguo
举报原因:
原因补充:

(最多只允许输入30个字)