【矩阵问题】PKU 3735 Training little cats

【矩阵问题】PKU 3735 Training little cats

 

对于每一次的操作用矩阵表示,这里的矩阵a是(n+1,n+1),初始化为一个单位矩阵

‘g’ num 操作,表示使第num个数增加1,使矩阵a的第num行最后一个元素增加1,即a[num][last]+=1

‘e’ num 操作,表示使第num个数变为0,使矩阵a的第num行全部变为0

即for(i=1:i<=last;i++) a[num][i]=0;

‘s’ num1,num2操作,表示使第num1和num2元素交换位置,使矩阵a 的第num1和num2行互换就可以了for(i=1:i<=last;i++) swap(a[num1][i],a[num2][i]);

最后结果就是a[i][n+1]

#include < iostream >
#include
< algorithm >
#include
< string >
#include
< vector >
#include
< cmath >
#include
< map >
using   namespace  std;
#define  maxn 102
int  m,n;
void  mul(__int64 sor1[][maxn],__int64 sor2[][maxn],__int64 des[][maxn])
{
    
for(int i=0;i<=n;i++)
        
for(int j=0;j<=n;j++)
        
{
            des[i][j]
=0;
            
for(int k=0;k<=n;k++)
                
if(sor1[i][k] && sor2[k][j])
                    des[i][j]
+=sor1[i][k]*sor2[k][j];
        }

}

void  copy(__int64 sor[][maxn],__int64 des[][maxn])
{
    
for(int i=0;i<=n;i++)
        
for(int j=0;j<=n;j++)
            des[i][j]
=sor[i][j];
}

void  multiply(__int64 sor[][maxn],__int64 des[][maxn], int  n)
{
    
if(n<=0)
    
{
        
for(int i=0;i<=n;i++)
        
{
            
for(int j=0;j<=n;j++)
                des[i][j]
=0;
            des[i][i]
=1;
        }

    }

    
else if(n==1)
        copy(sor,des);
    
/**//*else if(n==2)
        mul(sor,sor,des);
*/

    
else
    
{
        __int64 tmp[maxn][maxn];
        multiply(sor,tmp,n
/2);
        mul(tmp,tmp,des);
        
if(n%2)
        
{
            copy(des,tmp);
            mul(tmp,sor,des);
        }

    }

}

void  swap(__int64  &  a1,__int64  &  a2)
{
    __int64 tmp;
    tmp
=a1;    a1=a2;    a2=tmp;
}

void  print(__int64 a[][maxn])
{
    
for(int i=0;i<=n;i++)
    
{
        
for(int j=0;j<=n;j++)
            printf(
"%d ",a[i][j]);
        printf(
"\n");

    }

}

int  main()
{
    
char cmd;
    
int k;
    __int64 mat[maxn][maxn],ans[maxn][maxn];
    
while(scanf("%d%d%d",&n,&m,&k)!=EOF,n||m||k)
    
{
        memset(mat,
0,sizeof(mat));
        
for(int i=0;i<=n;i++)
            mat[i][i]
=1;
        
while(k--)
        
{
            getchar();
            cmd
=getchar();
            
if(cmd=='s')
            
{
                
int id1,id2;
                scanf(
"%d%d",&id1,&id2);
                id1
--,id2--;
                
for(int i=0;i<=n;i++)
                    swap(mat[id1][i],mat[id2][i]);
            }

            
else if(cmd=='g')
            
{
                
int id;
                scanf(
"%d",&id);
                id
--;
                mat[id][n]
++;
            }

            
else
            
{
                
int id;
                scanf(
"%d",&id);
                id
--;
                
for(int i=0;i<=n;i++)
                    mat[id][i]
=0;
            }

        }

        
//print(mat);
        multiply(mat,ans,m);
        printf(
"%I64d",ans[0][n]);
        
for(int i=1;i<n;i++)
            printf(
" %I64d",ans[i][n]);
        printf(
"\n");
    }

}

你可能感兴趣的:(【矩阵问题】PKU 3735 Training little cats)