hdu1757(矩阵加速)

来源:互联网 发布:linux samba进程 编辑:程序博客网 时间:2024/05/16 19:46

数据量为10^9,直接矩阵加速搞起

#include <cstring>#include <cstdio>const int N = 10;int MOD;int n;struct mat{    int a[N + 10][N + 10];};mat mul(mat x, mat y){    mat t;    for(int i = 0; i < N; i++)    {        for(int j = 0; j < N; j++)        {            t.a[i][j] = 0;            for(int k = 0; k < N; k++)            {                t.a[i][j] += (x.a[i][k] * y.a[k][j]) % MOD;            }            t.a[i][j] %= MOD;        }    }    return t;}mat pow(mat x, int b){    mat e;    for(int i = 0; i < N; i++)    {        for(int j = 0; j < N; j++)        {            e.a[i][j] = 0;        }    }    for(int i = 0; i < N; i++)    {        e.a[i][i] = 1;    }    while(b)    {        if(b & 1)        {            e = mul(e, x);        }        x = mul(x, x);        b >>= 1;    }    return e;}int main(int argc, char const *argv[]){    mat x;    while(~scanf("%d%d", &n, &MOD))    {        memset(x.a, 0, sizeof(x.a));        for(int i = 0; i < N; i++)        {            scanf("%d", &x.a[0][i]);        }        if(n < 10)        {            printf("%d", n % MOD);            continue;        }        for(int i = 1; i < N; i++)        {            x.a[i][i - 1] = 1;        }        x = pow(x, n - 9);        int ans = 0;        for(int i = 0; i < N; i++)        {            ans += ((9 - i) * x.a[0][i]) % MOD;        }        printf("%d\n", ans % MOD);    }    return 0;}


0 0
原创粉丝点击