4565 So Easy! 矩阵快速幂

题目大意:求

解题思路:这题跟HDU – 2256 Problem of Precision类似,,只不过这题是向上取整 有一个隐藏的条件:(a-1)^2 < b < a ^ 2 表明a – 1 < b < a 也就是(a – sqrt(b) )^n是小于1的 附上HDU – 2256 Problem of Precision的题解链接 注意int的范围,有可能会溢出

ll;const int N = 2;struct Matrix{ll mat[N][N];}A, B, tmp;int a, b, n, m;void init() {B.mat[0][0] = B.mat[1][1] = 1;B.mat[0][1] = B.mat[1][0] = 0;A.mat[0][0] = A.mat[1][1] = a;A.mat[0][1] = b;A.mat[1][0] = 1;}Matrix matrixMul(Matrix x, Matrix y) {for(int i = 0; i < N; i++)for(int j = 0; j < N; j++) {tmp.mat[i][j] = 0;for(int k = 0; k < N; k++)tmp.mat[i][j] += (x.mat[i][k] * y.mat[k][j]) % m;}return tmp;}void solve(){while(n) {if(n & 1)B = matrixMul(B,A);A = matrixMul(A,A);n >>= 1;}}int main() {while(scanf(“%d%d%d%d”, &a, &b, &n, &m) != EOF) {init();solve();printf(“%I64d\n”, (2 * B.mat[0][0]) % m);}return 0;}

却还是,会愚蠢的选择相互敌视的方式。即使背脊相抵,

4565 So Easy! 矩阵快速幂

相关文章:

你感兴趣的文章:

标签云: