vijos 1049 送给圣诞夜的礼品

来源:互联网 发布:易语言漂亮ui界面源码 编辑:程序博客网 时间:2024/04/28 06:19
这题是基础了,无耐C++驾驭能力不高...线性代数也弱
   //矩阵与置换之间的关系//不用写=//小心函数的本地指代//函数用完内存全释放//把指数想象成二进制数就可以理解了//单位矩阵别搞错了
//time=0的时候彻底被坑了#include<cstdio>#include<cstring>using namespace std;typedef class matrix{    public:    int num[102][102],n,m;    void init(void)    {        memset(num,0,sizeof(num));    }    friend matrix  operator *(matrix &,matrix &);}matrix; matrix  operator *(matrix &a,matrix &b){    int i,j,t;    matrix tem;    tem.n=a.n;    tem.m=b.m;    for(i=0;i<a.n;i++)      for(j=0;j<b.m;j++)      {          tem.num[i][j]=0;        for(t=0;t<a.m;t++)          tem.num[i][j]+=a.num[i][t]*b.num[t][j];      }    return tem;}matrix tem,big,small,num;int main(void){        int i,j,n,m,k,time,end,x;    scanf("%d%d%d",&n,&m,&k);    num.n=n;num.m=1;    for(i=0;i<n;i++)        num.num[i][0]=i+1;    big.init();    small.init();    end=k%m;time=k/m;    big.n=big.m=n;    for(i=0;i<n;i++)    {        scanf("%d",&x);        x--;        big.num[i][x]=1;    }    if(end==1)    small=big;    for(i=1;i<m;i++)    {        tem.init();        tem.n=tem.m=n;       for(j=0;j<n;j++)       {           scanf("%d",&x);           x--;           tem.num[j][x]=1;       }       big=tem*big;       if(i==end-1)           small=big;    }    if(!end)    {        small.n=small.m=n;        for(i=0;i<n;i++)        small.num[i][i]=1;    }    tem.n=tem.m=n;    tem.init();    for(i=0;i<n;i++)    tem.num[i][i]=1;    while(time)   {        if(time&1)tem=tem*big;        big=big*big;        time>>=1;    }    big=tem;    num=big*num;    num=small*num;    for(i=0;i<n;i++)printf("%d ",num.num[i][0]);    printf("\n");    return 0;}

原创粉丝点击