[POJ 3735] 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 the cats to do some exercises. Facer has well designed a set of moves for his cats. He is now asking you to supervise the
cats to do his exercises. Facer's great exercise for cats contains three different moves:
g i : Let the ith cat take a peanut.
e i : Let the ith cat eat all peanuts it have.
s i j : Let the ith cat and jth cat exchange their peanuts.
All the cats perform a sequence of these moves and must repeat it m times! Poor cats! Only Facer can come up with such embarrassing idea.
You have to determine the final number of peanuts each cat have, and directly give them the exact quantity in order to save them.
Input
The input file consists of multiple test cases, ending with three zeroes "0 0 0". For each test case, three integers n, m and k are given firstly, where n is the number of cats and k is the length of the move
sequence. The following k lines describe the sequence.
(m≤1,000,000,000, n≤100, k≤100)
Output
For each test case, output n numbers in a single line, representing the numbers of peanuts the cats have.
Sample Input
- 3 1 6
- g 1
- g 2
- g 2
- s 1 2
- g 3
- e 2
- 0 0 0
Sample Output
- 2 0 1
Source
问最后每仅仅猫各有多少花生剩余。

- /*
- 稀疏矩阵乘法优化
- */
- for (int i = 0; i < n; i++)
- for (int j = 0; j < m; j++) {
- if (!a[i][j]) continue; //稀疏矩阵乘法优化
- for (int k = 0; k < b.m; k++)
- tmp.a[i][k] += a[i][j] * b.a[j][k];
- }
2. 尽管M,N,K都是 int 范围的,可是操作之后,每仅仅猫的花生数量会超 int。
- /*
- ID: wuqi9395@126.com
- PROG:
- LANG: C++
- */
- #include<map>
- #include<set>
- #include<queue>
- #include<stack>
- #include<cmath>
- #include<cstdio>
- #include<vector>
- #include<string>
- #include<fstream>
- #include<cstring>
- #include<ctype.h>
- #include<iostream>
- #include<algorithm>
- #define INF (1<<30)
- #define PI acos(-1.0)
- #define mem(a, b) memset(a, b, sizeof(a))
- #define For(i, n) for (int i = 0; i < n; i++)
- typedef long long ll;
- using namespace std;
- const int maxn = 110;
- const int maxm = 110;
- const int mod = 10000;
- struct Matrix {
- int n, m;
- ll a[maxn][maxm];
- void clear() {
- n = m = 0;
- memset(a, 0, sizeof(a));
- }
- Matrix operator * (const Matrix &b) const {
- Matrix tmp;
- tmp.clear();
- tmp.n = n; tmp.m = b.m;
- for (int i = 0; i < n; i++)
- for (int j = 0; j < m; j++) {
- if (!a[i][j]) continue; //稀疏矩阵乘法优化
- for (int k = 0; k < b.m; k++)
- tmp.a[i][k] += a[i][j] * b.a[j][k];
- }
- return tmp;
- }
- };
- int n, k, m;
- void init(int n, Matrix &I) {
- for (int i = 0; i <= n; i++) {
- for (int j = 0; j <= n; j++) {
- I.a[i][j] = 0LL;
- }
- I.a[i][i] = 1LL;
- }
- I.n = I.m = n + 1;
- }
- Matrix Matrix_pow(Matrix A, int k) {
- Matrix res;
- init(n, res);
- while(k) {
- if (k & 1) res = res * A;
- k >>= 1;
- A = A * A;
- }
- return res;
- }
- int main () {
- Matrix A, I, res;
- while(scanf("%d%d%d", &n, &m, &k)) {
- if (m == 0 && n == 0 && k == 0) {
- break;
- }
- A.clear();
- A.n = n + 1; A.m = 1;
- A.a[n][0] = 1LL;
- char ch;
- int u, v;
- init(n, res);
- while(k--) {
- init(n, I);
- getchar();
- scanf("%c", &ch);
- if (ch == 'g') {
- scanf("%d", &u);
- I.a[u - 1][n] = 1LL;
- }
- if (ch == 's') {
- scanf("%d%d", &u, &v);
- I.a[u - 1][u - 1] = 0LL; I.a[u - 1][v - 1] = 1LL;
- I.a[v - 1][v - 1] = 0LL; I.a[v - 1][u - 1] = 1LL;
- }
- if (ch == 'e') {
- scanf("%d", &u);
- I.a[u - 1][u - 1] = 0LL;
- }
- res = I * res; //每次操作时。I应该乘在前面,由于矩阵乘法没有交换律
- }
- Matrix tmp = Matrix_pow(res, m);
- tmp = tmp * A;
- for (int i = 0; i < n; i++) {
- printf("%lld ", tmp.a[i][0]);
- }
- cout<<endl;
- }
- return 0;
- }
上述图片来自:http://blog.csdn.net/magicnumber/article/details/6217602
版权声明:本文博主原创文章,博客,未经同意不得转载。
[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 ...
- 矩阵快速幂 POJ 3735 Training little cats
题目传送门 /* 题意:k次操作,g:i猫+1, e:i猫eat,s:swap 矩阵快速幂:写个转置矩阵,将k次操作写在第0行,定义A = {1,0, 0, 0...}除了第一个外其他是猫的初始值 自 ...
- POJ 3735 Training little cats(矩阵快速幂)
Training little cats Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 11787 Accepted: 2892 ...
- POJ 3735 Training little cats<矩阵快速幂/稀疏矩阵的优化>
Training little cats Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 13488 Accepted: ...
- POJ 3735 Training little cats(矩阵乘法)
[题目链接] http://poj.org/problem?id=3735 [题目大意] 有一排小猫,给出一系列操作,包括给一只猫一颗花生, 让某只猫吃完所有的花生以及交换两只猫的花生, 求完成m次操 ...
- POJ 3735 Training little cats 矩阵快速幂
http://poj.org/problem?id=3735 给定一串操作,要这个操作连续执行m次后,最后剩下的值. 记矩阵T为一次操作后的值,那么T^m就是执行m次的值了.(其实这个还不太理解,但是 ...
- poj 3735 Training little cats 矩阵快速幂+稀疏矩阵乘法优化
题目链接 题意:有n个猫,开始的时候每个猫都没有坚果,进行k次操作,g x表示给第x个猫一个坚果,e x表示第x个猫吃掉所有坚果,s x y表示第x个猫和第y个猫交换所有坚果,将k次操作重复进行m轮, ...
- poj 3735 Training little cats(矩阵快速幂,模版更权威,这题数据很坑)
题目 矩阵快速幂,这里的模版就是计算A^n的,A为矩阵. 之前的矩阵快速幂貌似还是个更通用一些. 下面的题目解释来自 我只想做一个努力的人 @@@请注意 ,单位矩阵最初构造 行和列都要是(猫咪数+1) ...
- POJ 3735 Training little cats
题意 维护一个向量, 有三种操作 将第\(i\)个数加1 将第\(i\)个数置0 交换第\(i\)个数和第\(j\)个数 Solution 矩阵乘法/快速幂 Implementation 我们将向量写 ...
随机推荐
- hive udaf 用maven打包运行create temporary function 时报错
用maven打包写好的jar,在放到hive中作暂时函数时报错. 错误信息例如以下: hive> create temporary function maxvalue as "com. ...
- uva 657
很简单的题,就是题意不懂……! 就是判断每个'*'区域内‘X’区域块的个数 WA了好多次,就是太差了: 1.结果排序输出 2.因为是骰子所以不再1-6范围内的数字要舍弃 3.格式要求要空一行…… 4. ...
- mysql基础: mysql列类型--字符串
mysql列类型:整型 http://blog.csdn.net/jk110333/article/details/9342283 mysql列类型--时间和日期 http://blog.csd ...
- Linux学习记录--匿名沟通渠道
匿名沟通渠道 管道Linux最初支持Unix IPC其中的一种形式.具有下列特征: 1.管道是半双工.数据可以仅在一个方向流动:当双方需要沟通.建设两条管线需要. 2.仅仅能用于父子进程或者兄弟进程之 ...
- javacsript (十一) 对象
他的对象的概念和python的字典的格式一样, JavaScript 对象 对象由花括号分隔.在括号内部,对象的属性以名称和值对的形式 (name : value) 来定义.属性由逗号分隔: var ...
- Delphi XE7 用indy开发微信公众平台所有功能(10篇博客)
http://www.cnblogs.com/devinlee/p/4282498.html http://www.cnblogs.com/devinlee/p/4565933.html
- QEventLoop等待另外一个事件的停止,非常实用 good
void MyWidget::SendRequest(QString strUser) { network_manager = new QNetworkAccessManager(); connect ...
- BCB/Delphi中常用的VCL函数说明(文件函数)
--------------------文件操作--------------------函数名称:ChangeFileExt函数说明:更改指定文件的扩展名,函数原型如下:AnsiString __fa ...
- CAS (1) —— Mac下配置CAS到Tomcat(服务端)(转)
tomcat版本: tomcat-8.0.29 jdk版本: jdk1.8.0_65 cas版本: cas4.1.2cas-client-3.4.1 参考来源: CAS实现单点登录(SSO)经典完整教 ...
- leetcode 最长连续序列 longest consecutive sequence
转载请注明来自souldak,微博:@evagle 题目(来自leetcode): 给你一个n个数的乱序序列,O(N)找出其中最长的连续序列的长度. 例如给你[100, 4, 200, 1, 3, 2 ...