首页 > 代码库 > 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 (矩阵快速幂)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。