概述
3 8 4 7 4 8
6 21
题意:这个怎么说,就是找 递推公式,计算呗!
思路:
矩阵快速幂(可以先拿Fibonacci数列试手,网上有Fibonacci数列快速幂的解析,自己查)
主要是找递推公式,
f(n)=f(n-1)+g;
f(n)=f(n-1)+f(n-3)+g';
f(n)=f(n-1)+f(n-3)+f(n-4);
SO f(n)=f(n-1)+f(n-3)+f(n-4)位最后的公式。
剩下的基本套模板就行了。
AC代码:
#include<iostream> #include<algorithm> #include<stdlib.h> #define INF 99999999 using namespace std; const int MAX = 4; int array[MAX][MAX], sum[MAX][MAX]; void MatrixMult(int a[MAX][MAX], int b[MAX][MAX], int &mod){ int c[MAX][MAX] = { 0 }; for (int i = 0; i<MAX; ++i){ for (int j = 0; j<MAX; ++j){ for (int k = 0; k<MAX; ++k){ c[i][j] += a[i][k] * b[k][j]; } } } for (int i = 0; i<MAX; ++i){ for (int j = 0; j<MAX; ++j)a[i][j] = c[i][j] % mod; } } int MatrixPow(int k, int &mod){ for (int i = 0; i<MAX; ++i){ for (int j = 0; j<MAX; ++j)sum[i][j] = (i == j); } array[0][0] = array[0][1] = array[0][2] = 0, array[0][3] = 1; array[1][1] = array[1][2] = 0, array[1][0] = array[1][3] = 1; array[2][0] = array[2][3] = 0, array[2][1] = array[2][2] = 1; array[3][0] = array[3][1] = array[3][3] = 0, array[3][2] = 1; while (k){ if (k & 1)MatrixMult(sum, array, mod); MatrixMult(array, array, mod); k >>= 1; } int ans = 0; for (int i = 0; i<MAX; ++i)ans = (ans + sum[i][0] + sum[i][1] + sum[i][2] + sum[i][3]) % mod; return ans; } int main(){ int n, m; while (cin >> n >> m){ if (n == 0)cout << 0 << endl; else if (n == 1)cout << 2 % m << endl; else if (n == 2)cout << 4 % m << endl; else{ cout << MatrixPow(n - 2, m) << endl; } } system("pause"); return 0; }
感想:很长时间没复习快速幂了,这次复习一下。
最后
以上就是含糊舞蹈为你收集整理的课程练习三-1009-problem I的全部内容,希望文章能够帮你解决课程练习三-1009-problem I所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复