首页 > 代码库 > poj 3735 Training little cats (矩阵快速幂)

poj 3735 Training little cats (矩阵快速幂)

题目链接:

http://poj.org/problem?id=3735

题意:

有n只猫咪,开始时每只猫咪有花生0颗,现有一组操作,由下面三个中的k个操作组成:
               1. g i 给i只猫咪一颗花生米
               2. e i 让第i只猫咪吃掉它拥有的所有花生米
               3. s i j 将猫咪i与猫咪j的拥有的花生米交换

               现将上述一组操作做m次后,问每只猫咪有多少颗花生?

思路:

http://www.cnblogs.com/acSzz/archive/2012/08/20/2648087.html

 

代码:

  1 #include <iostream>
  2 #include <cstring>
  3 #include <algorithm>
  4 #include <cstdio>
  5 using namespace std;
  6 typedef long long ll;
  7 #define MS(a) memset(a,0,sizeof(a))
  8 #define MP make_pair
  9 #define PB push_back
 10 const int INF = 0x3f3f3f3f;
 11 const ll INFLL = 0x3f3f3f3f3f3f3f3fLL;
 12 inline ll read(){
 13     ll x=0,f=1;char ch=getchar();
 14     while(ch<0||ch>9){if(ch==-)f=-1;ch=getchar();}
 15     while(ch>=0&&ch<=9){x=x*10+ch-0;ch=getchar();}
 16     return x*f;
 17 }
 18 //////////////////////////////////////////////////////////////////////////
 19 const int maxn = 1e5+10;
 20 
 21 ll n,m,k;
 22 
 23 struct matrix{
 24     ll m[110][110];
 25     void clear(){
 26         MS(m);
 27     }
 28 }a;
 29 
 30 void init(){
 31     a.clear();
 32     for(int i=0; i<=n; i++)
 33         a.m[i][i] = 1;
 34 }
 35 
 36 matrix mul(matrix a,matrix b){
 37     matrix re;
 38     re.clear();
 39     for(int i=0; i<=n; i++){
 40         for(int k=0; k<=n; k++){
 41             if(a.m[i][k]){
 42                 for(int j=0; j<=n; j++){
 43                     re.m[i][j] = re.m[i][j]+a.m[i][k]*b.m[k][j];
 44                 }
 45             }
 46         }
 47     }
 48     return re;
 49 }
 50 
 51 matrix qpow(ll k){
 52     matrix e;
 53     e.clear();
 54     for(int i=0; i<=n; i++) e.m[i][i] = 1;
 55     while(k){
 56         if(k & 1) e = mul(e,a);
 57         a =  mul(a,a);
 58         k >>= 1;
 59     }
 60     return e;
 61 }
 62 
 63 int main(){
 64     while(cin>>n>>m>>k && (n+m+k)){
 65         init();
 66         for(int i=0; i<k; i++){
 67             char ch; scanf(" %c",&ch);
 68             if(ch == g){
 69                 ll x = read();
 70                 a.m[0][x]++;
 71             }
 72             if(ch == e){
 73                 ll x = read();
 74                 for(int j=0; j<=n; j++)
 75                     a.m[j][x] = 0;
 76             }
 77             if(ch == s){
 78                 ll x=read(),y=read();
 79                 if(x == y) continue;
 80                 for(int j=0; j<=n; j++)
 81                     swap(a.m[j][x],a.m[j][y]);
 82             }
 83         }
 84 
 85         if(m == 0){
 86             for(int i=0; i<n; i++)
 87                 if(i == 0) printf("0");
 88                 else printf(" 0");
 89             puts("");
 90             continue;
 91         }
 92 
 93         a = qpow(m);
 94 
 95         for(int i=1; i<=n; i++){
 96             if(i == 1) cout<<a.m[0][i];
 97             else cout<<" "<<a.m[0][i];
 98         }
 99         puts("");
100     }
101 
102     return 0;
103 }

 

poj 3735 Training little cats (矩阵快速幂)