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 }
时间: 2024-12-21 07:45:02

poj 3735 Training little cats (矩阵快速幂)的相关文章

POJ 3735 Training little cats 矩阵快速幂应用

点击打开链接 Training little cats Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9807   Accepted: 2344 Description Facer's pet cat just gave birth to a brood of little cats. Having considered the health of those lovely cats, Facer decides to

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

Training little cats Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10593   Accepted: 2532 Description Facer's pet cat just gave birth to a brood of little cats. Having considered the health of those lovely cats, Facer decides to make t

poj 3735 Training little cats 矩阵快速幂+稀疏矩阵乘法优化

题目链接 题意:有n个猫,开始的时候每个猫都没有坚果,进行k次操作,g x表示给第x个猫一个坚果,e x表示第x个猫吃掉所有坚果,s x y表示第x个猫和第y个猫交换所有坚果,将k次操作重复进行m轮,问最后这n个猫各自有多少坚果. 题解:构造(n+1)*(n+1)的单位矩阵,data[i][j]表示第i个猫与第j个猫进行交换,最后一列的前n项就是每个猫的坚果数目,s操作就交换对应行,矩阵快速幂时间复杂度O(n^3*log2(m))会超时,我们注意到在n*n的范围内每一行只有一个1,利用稀疏矩阵的

poj 3735 Training little cats矩阵快速幂

Training little cats Description Facer's pet cat just gave birth to a brood of little cats. Having considered the health of those lovely cats, Facer decides to make the cats to do some exercises. Facer has well designed a set of moves for his cats. H

poj 3735 Training little cats 矩阵

假设n=3 构造矩阵[1,0,0,0] 对于g 1操作,构造矩阵(0行i列++) 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 1 对于e 1操作,构造矩阵 (i整列清空) 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 对于s 1 2操作,构造矩阵 (i,j整列交换) 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 将k次操作依次按上述构造矩阵,得到一个轮回的转置矩阵.做m次快速幂就行了. 最坑的地方在于,答案要用longlong存,而longlo

矩阵快速幂 POJ 3735 Training little cats

题目传送门 1 /* 2 题意:k次操作,g:i猫+1, e:i猫eat,s:swap 3 矩阵快速幂:写个转置矩阵,将k次操作写在第0行,定义A = {1,0, 0, 0...}除了第一个外其他是猫的初始值 4 自己讲太麻烦了,网上有人讲的很清楚,膜拜之 5 详细解释:http://www.cppblog.com/y346491470/articles/157284.html 6 */ 7 #include <cstdio> 8 #include <cstring> 9 #inc

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

Description Facer's pet cat just gave birth to a brood of little cats. Having considered the health of those lovely cats, Facer decides to make the cats to do some exercises. Facer has well designed a set of moves for his cats. He is now asking you t

[POJ 3735] Training little cats (构造矩阵、矩阵快速幂)

Training little cats Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9613   Accepted: 2296 Description Facer's pet cat just gave birth to a brood of little cats. Having considered the health of those lovely cats, Facer decides to make th

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次后,问每只猫有多少颗花生? 再一次感受到了矩阵的强大...循环m次,且m这么大,很容易想到构造转换矩阵,但如何构造是个问题.尤其是第一种操作,第i只猫增加一个花生.具体构造方法是把矩阵扩大为(

POJ 3233 - Matrix Power Series ( 矩阵快速幂 + 二分)

POJ 3233 - Matrix Power Series ( 矩阵快速幂 + 二分) #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long LL; #define MAX_SIZE 30 #define CLR( a, b ) memset( a, b, sizeof(a) ) int MOD = 0; int n, k; st