矩阵快速幂(特殊矩阵+优化)upc2604

来源:互联网 发布:idea java log4j使用 编辑:程序博客网 时间:2024/06/01 20:47

构造出的矩阵:

A1...

A1 A2...

A1 A2  A3...

A1 A2 A3 .........An

辅助矩阵:

1 2 3......n

0 1 2......n-1

0 0 1......n-2

0 0 0......1

矩阵式对称的可以只保留(A1,A2.......An)和(1,2,3,....n)进行优化,这样矩阵运算的时候只需要两重循环

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int MOD=1000000007;int n,k;struct node{    long long a[2010];    void init(){memset(a,0,sizeof(a));}};node mul(node &a,node &b){    node tmp;    tmp.init();    for(int i=0;i<n;i++)        for(int j=0;j<=i;j++)        {            tmp.a[i]+=a.a[j]*b.a[i-j];            tmp.a[i]%=MOD;        }    return tmp;}node pow(node &a,int m){    node c;    c.init();    c.a[0]=1;    while(m)    {        if(m&1)c=mul(c,a);        a=mul(a,a);        m>>=1;    }    return c;}int main(){    //freopen("in.txt","r",stdin);    while(scanf("%d",&n)!=EOF)    {        node x,y;        x.init();        for(int i=0;i<n;i++)scanf("%lld",&x.a[i]);        scanf("%d",&k);        for(int i=0;i<n;i++)y.a[i]=i+1;        node tmp=pow(y,k);        tmp=mul(x,tmp);        for(int i=0;i<n-1;i++)            printf("%lld ",tmp.a[i]);        printf("%lld\n",tmp.a[n-1]);    }    return 0;}


0 0
原创粉丝点击