为生存而奔跑

   :: 首页 :: 联系 :: 聚合  :: 管理
  271 Posts :: 0 Stories :: 58 Comments :: 0 Trackbacks

留言簿(5)

我参与的团队

搜索

  •  

积分与排名

  • 积分 - 323490
  • 排名 - 74

最新评论

阅读排行榜

评论排行榜

 

对于每一次的操作用矩阵表示,这里的矩阵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");
    }

}
posted on 2009-08-17 14:36 baby-fly 阅读(521) 评论(1)  编辑 收藏 引用 所属分类: Algorithm

Feedback

# re: 【矩阵问题】PKU 3735 Training little cats 2010-11-06 12:22 aaa
你是做系统的?看你的编程风格  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理