HDU4565 So Easy!【矩阵连乘】【推导】
来源:互联网 发布:mysql随机取数据 编辑:程序博客网 时间:2024/05/29 13:24
题目链接:
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 __int64using 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;}
- HDU4565 So Easy!【矩阵连乘】【推导】
- hdu4565---So Easy!(矩阵)
- HDU4565 So Easy! (矩阵)
- hdu4565 so easy 矩阵
- HDU4565-So easy-数学推导化简递推矩阵快速幂
- hdu4565 So Easy!(矩阵快速幂)
- HDU4565 So Easy!【矩阵快速幂】
- HDU4565 So Easy!
- HDU4565 So Easy!
- 20130707 hdu4565 So Easy! 数学头脑+矩阵快速幂
- HDU4565 So Easy! 矩阵快速幂外加数学
- HDU4565-So Easy!(共轭运用+矩阵快速幂)
- HDU4565 So Easy!(数学+矩阵快速幂)
- HDU4565---So Easy!(矩阵快速幂(精度控制))
- hdoj So Easy! 4565 (矩阵连乘&反推)好题
- hdu 3117 Fibonacci Numbers(数学推导+矩阵连乘)
- hdu4565 So Easy! 广义斐波那契+矩阵快速幂+共轭构造
- So Easy! ——————hdu4565(矩阵快速幂)
- 一个出栈与入栈的例题(图片)
- markdown语法
- ssh连接限制
- MOOC《Linux内核分析》——进程切换的过程
- 贴片led正负极判断
- HDU4565 So Easy!【矩阵连乘】【推导】
- ssh使用私钥访问
- 华为实习生面试经历
- 理解进程调度时机跟踪分析进程调度与进程切换的过程
- spring 4 官方下载地址(Spring Framework 3.2.x&Spring Framework 4.0.x)
- Android开发端口号占用问题解决方案
- Java线程详解
- Linux 中 rc.local、init.d、rc.x、init 这几个文件(夹)各有什么作用?启动执行的脚本应该均放在 rc.local 中吗?
- Journey from a Python noob to a Kaggler on Python (从Python数据分析菜鸟到专家)