HDU4565 So Easy!【矩阵连乘】【推导】

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=4565

题目大意:

定义Sn = [( a + √b )^n] % m,[x]表示x向上取整,比如[3.14] = 4。给你a b n m的值,

求Sn是多少。

思路:

这道题很经典,因为(a-1)^2< b < a^2,所以0 < |a-√(b)| < 1,所以

Sn = [( a + √b )^n] % m = ( [( a + √b )^n]  + [(
a - √b))^n]  ) % m。

即右边其实是一个整数,如果将右边二项式展开的话,除了相互抵消的部分,剩下的部分全为

整数。这个式子设An = (a + √b)^n,Bn = (a - √b)^n,Cn = [An],Sn = Cn % m。

先来求Cn的递推公式。

设Cn = pC(n-1) + qC(n-2),特征方程为x^2 = p*x + q,从[( a + √b )^n]  + [( a - √b))^n]

可以看出特征根分别为a + √b和a - √b。则p = 2*a,q = b - a^2。

则Cn = 2*a*C(n-1) + (b-a^2)C(n-2)。然后开始构造矩阵

[   Cn   ]   =  [ 2*a    b-a^2 ] * [C(n-1)]

[C(n-1)]       [    1            0   ]   [C(n-2)]

[   Cn   ]   =  [ 2*a    b-a^2 ] ^(n-2)   *   [C2]

[C(n-1)]       [    1            0   ]                   [C1]

由上边Sn公式可知,C2 = 2*(a^2 + b),C1 = 2*a。

然后用矩阵快速幂求解得到Cn,然后输出就可以了。

AC代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#define LL __int64
using namespace std;
const int MAXN = 2;
struct Matrix
{
    LL m[MAXN][MAXN];
};
LL A,B,N,M,ret,mo;
Matrix I =
{
    1,0,
    0,1
};
Matrix Multi(Matrix a, Matrix b,LL mo)
{
    Matrix c;
    for(int i = 0; i < MAXN; ++i)
    {
        for(int j = 0; j < MAXN; ++j)
        {
            c.m[i][j] = 0;
            for(int k = 0; k < MAXN; ++k)
            {
                c.m[i][j] += a.m[i][k] * b.m[k][j];
            }
            c.m[i][j] %= mo;
        }
    }
    return c;
}

Matrix Power(Matrix a, LL k)
{
    Matrix ans = I, p = a;
    while(k)
    {
        if(k&1)
            ans = Multi(ans,p,mo);
        p = Multi(p,p,mo);
        k >>= 1;
    }
    return ans;
}

int main()
{

    Matrix a,ans;
    while(cin >> A >> B >> N >> mo)
    {
        a.m[0][0] = 2*A%mo;
        a.m[0][1] = ((B%mo-A*A%mo)%mo + mo) % mo;
        a.m[1][0] = 1;
        a.m[1][1] = 0;
        if(N == 1)
            cout << 2*A % mo << endl;
        else
        {
            ans = Power(a,N-2);
            ret = (ans.m[0][0]%mo*2*(A*A%mo+B%mo)%mo + 2*A%mo*ans.m[0][1]%mo)%mo;
            ret %= mo;
            cout << ret << endl;
        }
    }

    return 0;
}
时间: 2024-08-10 23:11:20

HDU4565 So Easy!【矩阵连乘】【推导】的相关文章

HDU4565 So Easy! 矩阵快速幂外加数学

easy 个屁啊,一点都不easy,题目就是要求公式的值,但是要求公式在最后的取模前的值向上取整,再取模,无脑的先试了快速幂 double  fmod来做,结果发现是有问题的,这题要做肯定得凑整数,凑整  题目给 a+√b 那么加上a-√b就可以了,可是这样加上后面怎么处理还得减去,想了半年也想不出来, 原来用了负数的共轭思想,还有就是题目给的b的范围 是 ((a-1)*(a-1),a*a),所以 a-√b的值的 无论多少次方 的值都是小于1的,所以对于原式子 改装成 ((a + √b) ^n+

HDU4565 So Easy! 矩阵高速幂外加数学

easy 个屁啊,一点都不easy,题目就是要求公式的值,但是要求公式在最后的取模前的值向上取整.再取模,无脑的先试了高速幂 double  fmod来做,结果发现是有问题的.这题要做肯定得凑整数,凑整  题目给 a+√b 那么加上a-√b就能够了.但是这样加上后面怎么处理还得减去.想了半年也想不出来. 原来用了负数的共轭思想.还有就是题目给的b的范围 是 ((a-1)*(a-1),a*a).所以 a-√b的值的 不管多少次方 的值都是小于1的,所以对于原式子 改装成 ((a + √b) ^n+

HDU4565 So Easy!

1 /* 2 HDU4565 So Easy! 3 http://acm.hdu.edu.cn/showproblem.php?pid=4565 4 数论 快速幂 矩阵快速幂 5 题意:求[(a+sqrt(b))^n ]%m [ ]代表向上取证 6 联想到斐波那契数列,所以第一感觉是矩阵快速幂 7 后来发现根本不用这么麻烦,我们认为a+b*sqrt(c)中的a为实部 8 b为虚部,就能直接用二元乘法模拟矩阵快速幂了,因此这两种方法 9 是等价的.于是乎,我们就解决了精度问题. 10 然而即使我们

【矩阵快速幂】HDU4565 So Easy!

题意:给a, b, n, m 求 $\left \lceil ( a+ \sqrt b )^n \right \rceil$ % m 看到 $( a+ \sqrt b )^n$ 虽然很好联想到共轭 但是推出矩阵还是比较难的 数据范围为:$(a-1)^2 < b < a^2$ 那么  $a-1 < sqrt b < a$ 那么          $0 < a-sqrt b < 1$

hdu4565 So Easy!(矩阵快速幂)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4565 题解:(a+√b)^n=xn+yn*√b,(a-√b)^n=xn-yn*√b, (a+√b)^n=2*xn-(a-√b)^n,(0<=a-√b<=1),所以整数部分就是2*xn 然后再利用两个公式 (a+√b)^(n+1)=(a+√b)*(xn+yn*√b) (a-√b)^(n+1)=(a-√b)*(xn-yn*√b) 联立得到 x(n+1)=a*xn+b*yn y(n+1)=xn+a*yn

hdu4565---So Easy!(矩阵)

Problem Description A sequence Sn is defined as: Where a, b, n, m are positive integers.┌x┐is the ceil of x. For example, ┌3.14┐=4. You are to calculate Sn. You, a top coder, say: So easy! Input There are several test cases, each test case in one lin

HDU 4565 So Easy! 矩阵快速幂 + 共轭数

题意:中文题 So Easy 解题思路: 这题应该是 HDU 2256的原题 , 根据类似的结论可以推出 中间矩阵 ta  1 tb ta 原矩阵 1 1 解题代码: 1 // File Name: temp.cpp 2 // Author: darkdream 3 // Created Time: 2014年09月17日 星期三 11时35分45秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #inc

2013长沙邀请赛A So Easy!(矩阵快速幂,共轭)

So Easy! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2286    Accepted Submission(s): 710 Problem Description A sequence Sn is defined as:Where a, b, n, m are positive integers.┌x┐is the ceil

痛苦的 01 矩阵(和式推导)

[传送门]https://acm.ecnu.edu.cn/contest/113/problem/C/ [题解] 推导过程: [技巧] (1)直接用二维数组存储矩阵肯定超内存,注意到K的范围该矩阵是一个稀疏的矩阵所以直接将其转化为线性的,a[(i-1)+j]表示其第i行第j列的状况 (2)注意到单个点的改动只能影响到十字形的局部,所以在每次求ans时可以利用上一次的ans加上这一次改动形成的差值(或者说叫贡献). (3)一定要注意和式变换时无关项∑别轻易丢弃,也许它形成一个常数n的系数. [AC