poj 3753 Training little cats_矩阵快速幂
题意: 通过各种操作进行,给第i只猫花生,第i只猫吃光花生,第i只猫和第j只猫互换花生,问n次循环操作后结果是什么
很明显是构建个矩阵,然后矩阵相乘就好了
#include <iostream> #include <cstdio> #include<cstring> using namespace std; #define LL long long #define N 110 LL n,m,d; struct node{ LL mat[N][N]; node operator*(const node &x){ node tmp; int i,j,k; memset(tmp.mat,0,sizeof(tmp.mat)); for(i=0;i<=n;i++) for(k=0;k<=n;k++){ if(mat[i][k]){ for(j=0;j<=n;j++){ tmp.mat[i][j]+=mat[i][k]*x.mat[k][j]; } } } return tmp; } }cat; node solve(){ int i; if(m==1) return cat; node bcat; memset(bcat.mat,0,sizeof(bcat.mat)); for(i=0;i<=n;i++) bcat.mat[i][i]=1; if(m==0) return bcat; while(m){ if(m&1) bcat=bcat*cat; m>>=1; cat=cat*cat; } return bcat; } int main(int argc, char** argv) { int i,j,k; LL a,b; char str[10]; while(scanf("%lld%lld%lld",&n,&m,&d)!=EOF){ if(!n&&!m&&!d) break; memset(cat.mat,0,sizeof(cat.mat)); for(i=0;i<=n;i++){ cat.mat[i][i]=1; } while(d--){ scanf("%s",str); if(str[0]=='g'){ scanf("%lld",&a); cat.mat[0][a]++; }else if(str[0]=='e'){ scanf("%lld",&a); for(i=0;i<=n;i++) cat.mat[i][a]=0; }else{ scanf("%lld%lld",&a,&b); for(i=0;i<=n;i++){ LL t=cat.mat[i][a]; cat.mat[i][a]=cat.mat[i][b]; cat.mat[i][b]=t; } } } node sum=solve(); for(i=1;i<n;i++) printf("%lld ",sum.mat[0][i]); printf("%lld\n",sum.mat[0][i]); } return 0; }
不怕路长,只怕心老.