标签:Matrix int ++ Vector Recurrences 10870 UVA sizeof matrix
#include<bits/stdc++.h> using namespace std; const int maxd = 100 + 4; int d, n, m; typedef long long Matrix[maxd][maxd]; typedef long long Vector[maxd]; Vector a, f; //务必秉承不修改原变量的思想。因此开辟t这个辅助空间。 //因为有可能R和A都是指向同一块内存的两个指针,如果修改了R,则也修改了A,将导致错误。 void matrix_mul(Matrix A, Matrix B, Matrix R) { Matrix t; memset(t, 0, sizeof(t)); for(int i = 0; i < d; i++){ for(int j = 0; j < d; j++){ for(int k = 0; k < d; k++){ t[i][j] = (t[i][j] + A[i][k]*B[k][j]) % m; } } } memcpy(R, t, sizeof(t)); } void matrix_pow(Matrix A, int n, Matrix R) { Matrix a, r; //cout << sizeof(a) << ' ' << sizeof(A) << endl; memcpy(a, A, sizeof(a)); memset(r, 0, sizeof(r)); for(int i = 0; i < d; i++) r[i][i] = 1; while(n){ if(n&1){ matrix_mul(r, a, r); } n >>= 1; matrix_mul(a, a, a); } memcpy(R, r, sizeof(r)); } void matrix_mul_vector(Matrix A, Vector V, Vector R) { Vector v; memset(v, 0, sizeof(v)); for(int i = 0; i < d; i++){ for(int j = 0; j < d; j++) v[i] = (v[i] + A[i][j]*V[j]) % m; } memcpy(R, v, sizeof(v)); } int main() { while(cin >> d >> n >> m && d){ for(int i = 0; i < d; i++) cin >> a[i]; for(int i = 0; i < d; i++) cin >> f[i]; Matrix A; memset(A, 0, sizeof(A)); for(int i = 0; i < d; i++){ A[d-1][i] = a[d-i-1]; if(i != 0) A[i-1][i] = 1; } matrix_pow(A, n - d, A); matrix_mul_vector(A, f, f); cout << f[d-1] << endl; } return 0; } /* 3 3 3 1 2 1 2 3 1 1 2 3 */
标签:Matrix,int,++,Vector,Recurrences,10870,UVA,sizeof,matrix 来源: https://www.cnblogs.com/sanshi-2018/p/10526805.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。