HDU 4565 So Easy!
2016-07-30 15:37
204 查看
题目分析
Sn=⌈(a+b√)n⌉%m因为(a−1)2<b<a2 ,所以0<(a−b√)n<1,因此Sn=⌈(a+b√)n+(a−b√)n⌉%m
接下来我们证明Sn=2∗a∗Sn−1+(b−a2)Sn−2。
Sn=(a+b√)n+(a−b√)n;Sn−1=(a+b√)n−1+(a−b√)n−1;移项得:Sn−(a−b√)nSn−1−(a−b√)n−1=a+b√;Sn−(a−b√)n=(a+b√)∗Sn−1−(a+b√)∗(a−b√)n−1;Sn=(a+b√)∗Sn−1−2∗a∗(a−b√)n−1;Sn−1=(a+b√)∗Sn−2−2∗a∗(a−b√)n−2;Sn−(a+b√)∗Sn−1Sn−1−(a+b√)∗Sn−2=a−b√化简得:Sn=2∗a∗Sn−1+(b−a2)∗Sn−2;
有上述的推导式子很明显可以推导出一个矩阵,然后利用矩阵快速幂求解即可。
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; typedef long long LL; LL a,b,n,m; struct Matirx{ int r,c; LL matirx[2][2]; }; Matirx one, start, another; Matirx Mul(Matirx a, Matirx b){ //矩阵乘法 Matirx c; c.r = a.r; c.c = b.c; for(int i = 0; i < a.r; i++){ for(int j = 0; j < b.c; j++){ c.matirx[i][j] = 0; for(int k = 0; k < a.c; k++) c.matirx[i][j] += a.matirx[i][k]*b.matirx[k][j]; c.matirx[i][j] %= m; } } return c; } Matirx Quick_pow(int n){ //矩阵快速幂 Matirx ret = one, temp = start; while(n){ if(n&1) ret = Mul(ret, temp); temp = Mul(temp, temp); n >>= 1; } return ret; } void init(){ //初始化 one.r = one.c = start.c = start.r = 2; one.matirx[0][0] = 1; one.matirx[0][1] = 0; one.matirx[1][0] = 0; one.matirx[1][1] = 1; start.matirx[0][0] = 0; start.matirx[0][1] = 1; start.matirx[1][0] = b-a*a; start.matirx[1][1] = 2*a; another.r = 2; another.c = 1; another.matirx[0][0] = 2*a; another.matirx[1][0] = 2*(a*a+b); } int main(){ while(scanf("%I64d%I64d%I64d%I64d", &a, &b, &n, &m) != EOF){ init(); if(n == 1) printf("%I64d\n", (2*a)%m); else if(n == 2) printf("%I64d\n", (2*(a*a+b))%m); else { Matirx ret = Quick_pow(n-2); another = Mul(ret, another); printf("%I64d\n", (another.matirx[1][0]+m)%m); //这里一定要注意,因为构建start矩阵时你会发现b-a*a为负数,因此可能会出现负值 } } return 0; }
相关文章推荐
- hdu 4565 So Easy! 矩阵快速幂
- hdu - 4565 - So Easy!(矩阵快速幂)
- hdu 4565 So Easy!
- HDU 4565——So Easy!(矩阵快速幂乘法)
- HDU 4565 So Easy!
- So Easy! HDU - 4565(矩阵快速幂,无理数矩阵构造,共轭构造)
- HDU 4565 So Easy!(思想+矩阵快速幂)——2013 ACM-ICPC长沙赛区全国邀请赛
- [HDU 4565] So Easy! (数学)
- hnu13150(hdu 4565)SO EASY!(矩阵快速幂)
- hdu 4565 So Easy!
- HDU 4565 So Easy!(共轭复数 + 矩阵快速幂 数论)
- HDU 4565 So Easy! 解题报告
- 数学(矩阵乘法):HDU 4565 So Easy!
- hdu 4565 So Easy! 共轭构造+斐波那契矩阵加速
- HDU 4565 -- So Easy! (矩阵幂模板)
- 2013长沙邀请赛 HDU 4565 So Easy!(矩阵快速幂)
- hdu 4565 So Easy!
- Hdu 4565 So Easy! (数学 构造矩阵)
- HDU 4565 So Easy! 矩阵快速幂
- HDU 4565 So Easy!(公式化简+矩阵)