矩阵快速幂 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 #include <cmath>
10 #include <algorithm>
11 using namespace std;
12
13 typedef long long ll;
14 const int MAXN = 1e2 + 10;
15 const int INF = 0x3f3f3f3f;
16 struct Mat  {
17     ll m[MAXN][MAXN];
18     Mat ()  {
19         memset (m, 0, sizeof (m));
20     }
21     void init(void) {
22         for (int i=0; i<MAXN; ++i)  m[i][i] = 1;
23     }
24 };
25 int n, m, k;
26
27 Mat operator * (Mat &a, Mat &b) {
28     Mat ret;
29     for (int k=0; k<=n; ++k)    {
30         for (int i=0; i<=n; ++i)    {
31             if (a.m[i][k])  {
32                 for (int j=0; j<=n; ++j)    {
33                     ret.m[i][j] += a.m[i][k] * b.m[k][j];
34                 }
35             }
36         }
37     }
38     return ret;
39 }
40
41 Mat operator ^ (Mat x, int n)   {
42     Mat ret;    ret.init ();
43     while (n)   {
44         if (n & 1)  ret = ret * x;
45         x = x * x;
46         n >>= 1;
47     }
48     return ret;
49 }
50
51 int main(void)  {       //POJ 3735 Training little cats
52     while (scanf ("%d%d%d", &n, &m, &k) == 3)   {
53         if (!n && !m && !k) break;
54         Mat A, T;   A.m[0][0] = 1;  T.init ();
55         char op[5]; int p, q;
56         while (k--) {
57             scanf ("%s", op);
58             if (op[0] == ‘g‘)    {
59                 scanf ("%d", &p);   T.m[0][p]++;
60             }
61             else if (op[0] == ‘e‘)  {
62                 scanf ("%d", &p);
63                 for (int i=0; i<=n; ++i)    T.m[i][p] = 0;
64             }
65             else    {
66                 scanf ("%d%d", &p, &q);
67                 for (int i=0; i<=n; ++i)    swap (T.m[i][p], T.m[i][q]);
68             }
69         }
70         Mat ans = A * (T ^ m);
71         for (int i=1; i<=n; ++i)    printf ("%I64d%c", ans.m[0][i], (i==n) ? ‘\n‘ : ‘ ‘);
72     }
73
74     return 0;
75 }
时间: 2024-08-24 19:55:31

矩阵快速幂 POJ 3735 Training little cats的相关文章

矩阵快速幂——POJ - 3735

题目链接 题目含义 对于n只猫,现在我们有g,e,s三种操作 g是让第a只猫得到一个花生 e是让第a只猫的花生全部没有 s是让第a只猫和第b只猫的花生互换 一共有K次操作,这还不算完 要我们重复m次这些操作后,得出的每只猫的花生个数 题目分析 如果不用重复m次操作的话,这道题可以说十分简单 但如果要重复m次,尤其m是个很大的数,那我们就要需要一个幂矩阵代替m 让每次的状态乘以幂矩阵就变成下一次的状态 而这个幂矩阵其实就是单位矩阵的变形,跟线性代数里的初等矩阵差不多 题目代码 #include<i

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(矩阵快速幂)

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 矩阵

假设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(构造矩阵)

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 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(矩阵构造,快速幂)

Training little cats Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10350   Accepted: 2471 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,利用稀疏矩阵的