poj 3735 Training little cats (矩阵快速幂)
Posted tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 (矩阵快速幂)的主要内容,如果未能解决你的问题,请参考以下文章
POJ-3735 Training little cats(矩阵快速幂)
poj 3735 Training little cats (矩阵快速幂)
poj3735—Training little cats(特殊操作转化为矩阵操作)
TZOJ--5480: 孤衾易暖 // POJ--3735 Training little cats (矩阵快速幂)