Matrix Power Series

来源:互联网 发布:中国图书版本数据 编辑:程序博客网 时间:2024/06/16 00:55

这里写图片描述

直接暴力不行
因为每项底数都是A 可以用结合律 可以找到递推式
如果k是奇数 那么dfs(k) = dfs(k-1)+A^k
否则 dfs(k) = dfs(k/2)+A^k*(dfs(k/2))//先把dfs(k/2)算出来再带进去

主要是
初始化一开始写成void函数的形式导致初始化失败
然后怎么改怎么wa
还有全局变量和局部变量冲突!!!!
花式过样例 可你就是wa 为啥?为啥?哈哈哈

#include<stdio.h>#include <math.h>#include <cstring>#include<algorithm>using namespace std;typedef long long LL;const int MAXN = 1e5;struct mat{    int rix[35][35];};int n,k,m;mat st;void init(mat t){    for (int i = 0;i < n; ++i)        for (int j = 0;j < n; ++j) t.rix[i][j] = 0;}mat mul(mat a,mat b){    mat c;    for (int i = 0;i < n; ++i) for (int j = 0;j < n; ++j) c.rix[i][j] = 0;    for (int i = 0;i < n; ++i){        for (int j = 0;j < n; ++j){            for (int k = 0;k < n; ++k){                c.rix[i][j] += a.rix[i][k]*b.rix[k][j];                c.rix[i][j] %= m;            }        }    }    return c;}mat q_mod(mat a,int b){    mat tm;    for (int i = 0;i < n; ++i) for (int j = 0;j < n; ++j) tm.rix[i][j] = (i==j);    while (b){        if (b&1) tm = mul(tm,a);        a = mul(a,a);        b>>=1;    }    return tm;}mat Sum(mat a,mat b){    mat c;    for (int i = 0;i < n; ++i) for (int j = 0;j < n; ++j) c.rix[i][j] = 0;    for (int i = 0;i < n; ++i){        for (int j = 0;j < n; ++j){            c.rix[i][j] = a.rix[i][j] + b.rix[i][j];            c.rix[i][j] %= m;        }    }    return c;}mat dfs(int cc){    if (cc==1) return st;    if (cc&1) return Sum(dfs(cc-1),q_mod(st,cc));    else {        mat ret = dfs(cc/2);        return Sum(ret,mul(q_mod(st,cc/2),ret));    }}int main(){    scanf("%d%d%d",&n,&k,&m);    for (int i = 0;i < n; ++i){        for (int j = 0;j < n; ++j) scanf("%d",&st.rix[i][j]);    }    mat ans = dfs(k);    for (int i = 0;i < n; ++i){        for (int j = 0;j < n; ++j){            printf("%d%c",ans.rix[i][j],j==n-1?'\n':' ');        }    }    return 0;}
原创粉丝点击