您的位置:首页 > 其它

UVa 10870 (矩阵快速幂) Recurrences

2015-03-14 13:53 447 查看
给出一个d阶线性递推关系,求f(n) mod m的值。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

const int maxn = 20;

typedef long long Matrix[maxn][maxn];
typedef long long Vector[maxn];

int d, n, m;

void matrix_mul(Matrix A, Matrix B, Matrix res)
{
Matrix C;
memset(C, 0, sizeof(C));
for(int i = 0; i < d; i++)
for(int j = 0; j < d; j++)
for(int k = 0; k < d; k++)
C[i][j] = (C[i][j] + A[i][k]*B[k][j]) % m;
memcpy(res, C, sizeof(C));
}

void matrix_pow(Matrix A, int n, Matrix res)
{
Matrix a, r;
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(res, r, sizeof(r));
}

int main()
{
//freopen("in.txt", "r", stdin);

while(cin >> d >> n >> m && d)
{
Matrix A;
memset(A, 0, sizeof(A));
Vector a, f;
for(int i = 0; i < d; i++) { cin >> a[i]; a[i] %= m; }
for(int i = 0; i < d; i++) { cin >> f[i]; f[i] %= m; }
if(n <= d) { cout << f[n-1] << "\n"; continue; }
for(int i = 0; i < d-1; i++) A[i][i+1] = 1;
for(int i = 0; i < d; i++) A[d-1][i] = a[d-i-1];
matrix_pow(A, n-d, A);
long long ans = 0;
for(int i = 0; i < d; i++) ans = (ans + A[d-1][i]*f[i]) % m;
cout << ans << "\n";
}

return 0;
}


代码君
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: