HDU 4565矩阵快速幂—— So Easy!
2017-08-09 22:05
369 查看
题目链接
借鉴别人的一张解题思路
转化成了 (a^n + b^n) %M
借鉴别人的一张解题思路
转化成了 (a^n + b^n) %M
#include<iostream> #include<string> #include<vector> #include<algorithm> #include<queue> #include<cstdio> #include<cstring> #include<cmath> #include<map> using namespace std; typedef long long ll; ll MOD ; struct Matrix { ll a[2][2]; Matrix() { memset(a, 0, sizeof(a)); } Matrix operator * (const Matrix y) { Matrix ans; for(int i = 0; i <= 1; i++) for(int j = 0; j <= 1; j++) for(int k = 0; k <= 1; k++) ans.a[i][j] += a[i][k]*y.a[k][j]; for(int i = 0; i <= 1; i++) for(int j = 0; j <= 1; j++) ans.a[i][j] %= MOD; return ans; } void operator = (const Matrix b) { for(int i = 0; i <= 1; i++) for(int j = 0; j <= 1; j++) a[i][j] = b.a[i][j]; } }; ll solve(ll a,ll b,ll n) { Matrix ans, trs; ans.a[0][1] = 1; //初始值 ans.a[0][0] = a; ans.a[0][1] = 2; // f(n) = a*f(n-1) + b * f(n-2); trs.a[0][0] = a; trs.a[1][0] = -b; trs.a[0][1] = 1; while(n) { if(n&1) ans = ans*trs; trs = trs*trs; n >>= 1; } return (ans.a[0][1]+ans.a[1][1]+MOD)%MOD;//improtant } int main() { ios_base::sync_with_stdio(false); // freopen("data.txt","r",stdin); ll aa,bb,m,n; while(cin>>aa>>bb>>n>>m) { ll p = 2*aa; ll q = aa*aa-bb; MOD = m; cout<<solve(p,q,n)<<endl; } return 0; }
相关文章推荐
- HDU-4565 So Easy! 矩阵快速幂 & 共轭构造
- hdu 4565 So Easy!(矩阵快速幂)
- hdu 4565So Easy!(巧妙的矩阵快速幂)
- HDU 4565 So Easy!(矩阵快速幂)
- HDU 4565——So Easy!(矩阵快速幂乘法)
- HDU 4565 So Easy! 矩阵快速幂
- HDU 4565 So Easy!(思想+矩阵快速幂)——2013 ACM-ICPC长沙赛区全国邀请赛
- 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!(矩阵快速幂+数学)
- HDU 4565 so easy(矩阵快速幂)
- 数学公式+矩阵快速幂 hdu-4565 So Easy!
- So Easy! HDU - 4565(矩阵快速幂,无理数矩阵构造,共轭构造)
- hdu 4565 - So Easy!(矩阵快速幂)
- HDU 4565 So Easy! (矩阵快速幂 + 向上取整)
- hdu - 4565 - So Easy!(矩阵快速幂)