HDU 3306 矩阵快速幂
来源:互联网 发布:linux 重启oracle 编辑:程序博客网 时间:2024/05/21 07:36
题解: S(n) = S(n - 1) + A(n)^2 = S(n-1) + x^2*A(n-1)^2 + 2*x*y*A(n-1)A(n-2) +y^2*A(n-2)^2构造矩阵
code :
#include <iostream>#include <cstring>#include <cstdio>using namespace std;const int p = 10007;int n, x, y;struct Matrix{ int mat[4][4]; void clr(){memset(mat, 0, sizeof mat);} void E(){ clr(); for(int i = 0; i < 4; ++i) mat[i][i] = 1; } Matrix operator * (const Matrix &rhs) const{ Matrix res; res.clr(); for(int i = 0; i < 4; ++i) for(int j = 0; j < 4; ++j) for(int k = 0; k < 4; ++k) res.mat[i][j] = (res.mat[i][j] + mat[i][k] * rhs.mat[k][j]) % p; return res; } Matrix operator ^ (int b){ Matrix res, tmp; res.E(); memcpy(tmp.mat, mat, sizeof mat); while(b){ if(b & 1) res = res * tmp; tmp = tmp * tmp; b >>= 1; } return res; }};int main(){ //freopen("in.txt", "r", stdin); while(cin >> n >> x >> y){ x %= p; y %= p; Matrix base; base.clr(); base.mat[0][0] = 1; /**row 1*/ base.mat[1][0] = base.mat[1][1] = x * x % p; base.mat[1][2] = 1; base.mat[1][3] = x; /**row 2*/ base.mat[2][0] = base.mat[2][1] = y * y % p; /**row 3*/ base.mat[3][0] = base.mat[3][1] = 2 * x * y % p; base.mat[3][3] = y; /**row 4*/ Matrix data; data.clr(); data.mat[0][0] = 2; data.mat[0][1] = data.mat[0][2] = data.mat[0][3] = 1; Matrix res = data * (base ^ (n - 1)); cout << res.mat[0][0] << endl; } return 0;}
0 0
- hdu 3306 矩阵快速幂
- hdu 3306(矩阵快速幂)
- HDU 3306 矩阵快速幂
- HDU 3306 矩阵快速幂,构造矩阵方法详解
- 【矩阵快速幂】hdu 1575
- 【矩阵快速幂】hdu 1757
- hdu 2604 矩阵快速幂
- hdu-1575矩阵快速幂
- hdu 1575 矩阵快速幂
- hdu 1575(矩阵快速幂)
- hdu 1757 矩阵快速幂
- hdu 1575 矩阵快速幂
- hdu 2855 矩阵快速幂
- hdu 3117 矩阵快速幂
- hdu 1005 矩阵快速幂
- hdu 4965 矩阵快速幂
- hdu 2793 矩阵快速幂
- HDU 5015(矩阵快速幂)
- 希尔排序
- 内存分配和回收策略简述
- hdu1269 迷宫城堡(强连通图)
- SSM杰信商务平台项目day01
- c3p0
- HDU 3306 矩阵快速幂
- 欢迎使用CSDN-markdown编辑器
- MongoDB基本语法
- C++set
- js实现往表格动态添加学生的学号、姓名、语数英的考试成绩和总分(总分不是填写),实现行与行之的颜色相间,高光的效果
- JAVAWEB开发之Spring详解之——AOP底层剖析(基于JDK和cglib)、Spring中的AOP以及基于AspectJ的AOP实现、Spring的JDBCTemplate详解
- Objective-C Method Swizzling
- 【GDOI2017第三轮模拟day2】树的难题(点剖,树状数组)
- C与C++中的const用法