对于每一次的操作用矩阵表示,这里的矩阵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])
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) ![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif) {
for(int i=0;i<=n;i++)
for(int j=0;j<=n;j++)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
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])
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) ![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif) {
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)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) ![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif) {
if(n<=0)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
for(int i=0;i<=n;i++)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
for(int j=0;j<=n;j++)
des[i][j]=0;
des[i][i]=1;
}
}
else if(n==1)
copy(sor,des);
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) /**//*else if(n==2)
mul(sor,sor,des);*/
else
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
__int64 tmp[maxn][maxn];
multiply(sor,tmp,n/2);
mul(tmp,tmp,des);
if(n%2)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
copy(des,tmp);
mul(tmp,sor,des);
}
}
}
void swap(__int64 & a1,__int64 & a2)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) ![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif) {
__int64 tmp;
tmp=a1; a1=a2; a2=tmp;
}
void print(__int64 a[][maxn])
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) ![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif) {
for(int i=0;i<=n;i++)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
for(int j=0;j<=n;j++)
printf("%d ",a[i][j]);
printf("\n");
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
}
}
int main()
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) ![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif) {
char cmd;
int k;
__int64 mat[maxn][maxn],ans[maxn][maxn];
while(scanf("%d%d%d",&n,&m,&k)!=EOF,n||m||k)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
memset(mat,0,sizeof(mat));
for(int i=0;i<=n;i++)
mat[i][i]=1;
while(k--)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
getchar();
cmd=getchar();
if(cmd=='s')
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
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')
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
int id;
scanf("%d",&id);
id--;
mat[id][n]++;
}
else
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
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");
}
}
|