HDU 4565 So Easy!
2013-06-02 21:44
267 查看
#include <utility> #include <algorithm> #include <string> #include <cstring> #include <cstdio> #include <iostream> #include <iomanip> #include <set> #include <vector> #include <cmath> #include <queue> #include <bitset> #include <map> #include <iterator> using namespace std; #define clr(a,v) memset(a,v,sizeof(a)) #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 const int INF = 0x7f7f7f7f; const int maxn = 11111; const int POW = 14; const double eps = 1e-8; const int mod = 777777777; typedef long long LL; typedef unsigned long long ULL; typedef pair<int, int> pii; typedef vector<LL> VI; typedef vector<VI> VVI; typedef vector<VVI> VVVI; VVI I, E, A; VVI multi(const VVI& A, const VVI& B, int m) { VVI res = VVI(2, VI(2, 0)); int i, j, k; for (i = 0; i < 2; ++i) { for (j = 0; j < 2; ++j) { for (k = 0; k < 2; ++k) { res[i][j] += A[i][k] * B[k][j]; res[i][j] %= m; } } } return res; } VVI cal(const VVI& A, int k, int m) { VVI res = E, t = A; while (k) { if (k & 1) res = multi(res, t, m); t = multi(t, t, m); k >>= 1; } return res; } int main() { A = I = E = VVI(2, VI(2, 0)); E[0][0] = E[1][1] = 1; int a, b, n, m; while (~scanf("%d%d%d%d", &a, &b, &n, &m)) { I[0][0] = I[1][1] = a; I[0][1] = b; I[1][0] = 1; A = cal(I, n - 1, m); LL ans = a * A[0][0] + A[0][1]; ans = (ans << 1) % m; printf("%I64d\n", ans); } return 0; }
相关文章推荐
- HDU 4565 So Easy! 矩阵快速幂
- hdu 4565 So Easy!
- hdu 4565 So Easy!
- HDU 4565 - 2013年长沙邀请赛 A-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!
- HDU - 4565_So Easy!_共轭构造&&矩阵快速幂
- HDU 4565 So Easy!
- HDU 4565 So Easy! 共轭构造+矩阵快速幂
- hdu 4565 So Easy!(矩阵+快速幂)
- hdu 4565 So Easy! /2013 ACM-ICPC 长沙赛区全国邀请赛A题 矩阵乘法
- HDU 4565 So Easy!
- HDU 4565 So Easy!(思想+矩阵快速幂)——2013 ACM-ICPC长沙赛区全国邀请赛
- HDU 4565 So Easy!
- HDU 4565 So Easy!(数学+矩阵快速幂)
- HDU 4565 So Easy!