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;

然后就是矩阵快速幂

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
typedef long long ll;
struct Matrix {
    ll dp[3][3];
};
ll a , b , n , m;
Matrix Mul(Matrix a , Matrix b) {
    Matrix c;
    memset(c.dp , 0 , sizeof(c.dp));
    for(int i = 0 ; i < 2 ; i++) {
        for(int j = 0 ; j < 2 ; j++) {
            for(int k = 0 ; k < 2 ; k++) {
                c.dp[i][j] += ((a.dp[i][k] * b.dp[k][j]) % m + m) % m;
            }
        }
    }
    return c;
}
Matrix quick_pow(Matrix a , ll k) {
    Matrix res;
    memset(res.dp , 0 , sizeof(res.dp));
    for(int i = 0 ; i < 2 ; i++) {
        res.dp[i][i] = 1;
    }
    while(k) {
        if(k & 1) res = Mul(res , a);
        k >>= 1;
        a = Mul(a , a);
    }
    return res;
}
int main() {
    while(~scanf("%lld%lld%lld%lld" , &a , &b , &n , &m)) {
        if(n == 0) {
            printf("%lld\n" , (ll)1 % m);
        }
        else {
            Matrix cnt , ans , sta;
            sta.dp[0][0] = 1 , sta.dp[1][0] = 0;
            cnt.dp[0][0] = a , cnt.dp[0][1] = b;
            cnt.dp[1][0] = 1 , cnt.dp[1][1] = a;
            ans = quick_pow(cnt , n);
            ans = Mul(ans , sta);
            printf("%lld\n" , 2 * ans.dp[0][0] % m);
        }
    }
    return 0;
}
时间: 2024-10-07 22:47:17

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+

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

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

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

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

HDU 4565 So Easy! 矩阵快速幂

设(a+sqrt(b))^n为(Xn + Yn*sqrt(b)),那么显然有(a+sqrt(b))^(n+1) 为 (a*Xn + b*Yn + (aYn+Xn)*sqrt(b)). 那么显然有(a+sqrt(b))的Xn,Yn可以表示为 : 然后又会发现,(a-sqrt(6))^n可以表示为: 那么会发现(a+sqrt(b))^n = (a+sqrt(b))^n + (a-sqrt(b))^n - (a-sqrt(b))^n = Xn+Yn*sqrt(b) +Xn-Yn*sqrt(b) -(a

HDU2256&amp;&amp;HDU4565:给一个式子的求第n项的矩阵快速幂

HDU2256 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2256 题意:求(sqrt(2)+sqrt(3))^2n%1024是多少. 这个题算是hdu4565的一个常数版本了,所以我们先说这道题.对于这道题的做法我们可以计算((sqrt(2)+sqrt(3))^2)^n=(5+2*sqrt(6))^n,对于(5+2*sqrt(6))^n我们知道答案必定是以an+bn*sqrt(6),而对于下一项我们只需要求(an+bn*sqrt(6))*(5

【构造共轭函数+矩阵快速幂】HDU 4565 So Easy! (2013 长沙赛区邀请赛)

链接 :click here~~ 题意: 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! [解题思路] 给一张神图,推理写的灰常明白了,关键是构造共轭函数,这一点实在是要有数学知识的理论基础,推出了递推式,接下

HDU4565-So Easy!(共轭运用+矩阵快速幂)

题目链接 题意: 求解  思路: 记(a+b√)n为An,配项 Cn=An+Bn=(a+b√)n+(a?b√)n 两项恰好共轭,所以Cn是整数.又根据限制条件 (a?1)2<b<a2?0<a?b√<1?0<(a?b√)n<1?Bn<1 也就是说Cn=?An? Sn=(Cn)%m 求Cn的方法是递推. 对Cn乘以(a+b√)+(a?b√) 于是 Cn+1=2aCn?(a2?b)Cn?1 把这个递推式写成矩阵形式 [Cn+1Cn]=[2a1?(a2?b)0][CnCn

hdu 4565 So Easy! (共轭构造+矩阵快速幂)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4565 题目大意: 给出a,b,n,m,求出的值, 解题思路: 因为题目中出现了开根号,和向上取整后求余,所以用矩阵快速幂加速求解过程的时候,会产生误差,就很自然地想到了凑数,因为(a-1)^2<b<a^2,得出0<a-sqrt(b)<1,则无论n取多大,(a-sqrt(b))^n都是小于1的,(a-sqrt(b))^n 与 (a+sqrt(b))^n共轭,两者展开后会相互抵销,所以(