[UVA10870] Recurrences

来源:互联网 发布:xmanager5 mac 编辑:程序博客网 时间:2024/04/29 16:31

矩阵快速幂的模板题 构造矩阵 

0 0 0 0 0 0 ad

1 0 0 0 0 0 a(d-1)

...........

0 0 0 0 0 1 a(n-1 )

#include<cstdio>#include<algorithm>#include<cstring>#include<iostream>using namespace std;#define MAXN 20#define MAXM 20typedef long long LL;struct Maxtrix{      int n, m;      LL A[MAXN+10][MAXN+10];  };LL a[MAXN+10], f[MAXN+10];int n, d;LL p;Maxtrix A, B, C, E;void init(Maxtrix &X){    X.n = X.m = 0;    memset(X.A, 0, sizeof(X.A));}void Get_E(){    E.n = E.m = MAXN;    for(int i = 0; i < E.n; i++)         E.A[i][i] = 1;}Maxtrix mul(Maxtrix AA, Maxtrix BB){    Maxtrix D;    init(D);    D.n = AA.n;    D.m = BB.m;    for(int i = 0; i < AA.n; i++)        for(int j = 0; j < BB.n; j++)            for(int k = 0; k < BB.m; k++)            {                D.A[i][k] += (AA.A[i][j] * BB.A[j][k]) % p;                D.A[i][k] %= p;            }    return D;}Maxtrix pow_mod(Maxtrix &A, int k){    Maxtrix ans = E, t = A;    ans.n = A.n;    ans.m = A.m;    while(k)    {        if(k & 1)            ans = mul(ans, t);        t = mul(t, t);        k >>= 1;    }    return ans;}int main(){    Get_E();    while(cin >> d >> n >> p && d+n+p)    {        for(int i = 0; i < d; i++) cin >> a[i];        for(int i = 0; i < d; i++) cin >> f[i];        init(A);        A.n = 1;        A.m = d;        for(int i = 0; i < d; i++)            A.A[0][i] = f[i];        init(B);        B.n = B.m = d;        for(int i = 0; i < d; i++)            B.A[i+1][i] = 1;        for(int i = d-1; i >= 0; i--)            B.A[i][d-1] = a[d-i-1];        Maxtrix tmp = pow_mod(B, n-d);        Maxtrix ans = mul(A, tmp);        cout << ans.A[0][d-1] << '\n';    }}/*          2 10 100 1 1 1 1             3 2147483647 12345 12345678 0 12345 1 2 3  0 0 0*/


0 0