讲课的例题第二题,当时觉得好麻烦,然而写了下发现比其他的题都要短好多
坑点:
1、多组数据
2、矩阵要开到102*102
3、m=0的情况
这个。。有毒
思路就是暴力构造出矩阵,1~n代表标号为i的小猫剩余的花生数量
n+1就是1,用于g操作
然后暴力构造后直接快速幂即可
初始矩阵
0
0
0
。
。
。
1
CODE:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
#include<string>
#include<map>
#include<cstring>
#include<vector>
#define inf 1e9
#define ll long long
#define For(i,j,k) for(ll i=j;i<=k;i++)
#define Dow(i,j,k) for(ll i=k;i>=j;i--)
using namespace std;
ll n,m,q;
struct mat
{
ll s_x,s_y;
ll a[105][105];
mat(){memset(a,0,sizeof a);}
};
mat mul(mat x,mat y)
{
mat tmp;
tmp.s_x=x.s_x;tmp.s_y=y.s_y;
For(i,1,tmp.s_x)
For(k,1,y.s_x)
if(x.a[i][k])
For(j,1,tmp.s_y)
tmp.a[i][j]+=x.a[i][k]*y.a[k][j];
return tmp;
}
mat ksm(mat x,ll y)
{
mat tmp=x;y--;
for(;y;y>>=1){if(y&1)tmp=mul(tmp,x);x=mul(x,x);} return tmp;
}
int main()
{
ios::sync_with_stdio(false);
while(1)
{
cin>>n>>m>>q;
if(n==0&&m==0&&q==0) return 0;
mat cube;
cube.s_x=cube.s_y=n+1;
For(i,1,n+1) cube.a[i][i]=1;
char c[5];
For(k,1,q)
{
ll x,y;
cin>>c;
if(c[0]=='g')
cin>>x,cube.a[x][n+1]+=1;
if(c[0]=='e')
{
cin>>x;
For(i,1,n+1) cube.a[x][i]=0;
}
if(c[0]=='s')
{
cin>>x>>y;
For(i,1,n+1) swap(cube.a[x][i],cube.a[y][i]);
}
}
if(m==0) {For(i,1,n) printf("0 ");puts("");continue;}
if(m!=0)
cube=ksm(cube,m);
mat A;
A.s_x=n+1;A.s_y=1;
A.a[n+1][1]=1;
A=mul(cube,A);
For(i,1,n) printf("%lld ",A.a[i][1]);
puts("");
}
}