1. 程式人生 > >poj 3735 Training little cats (矩陣快速冪)

poj 3735 Training little cats (矩陣快速冪)

log ack make .cn code little logs 矩陣快速冪 style

題目鏈接:

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 (矩陣快速冪)