Training little cats

Time Limit: 2000MS Memory Limit: 65536K

Total Submissions: 11787 Accepted: 2892

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

这个也是构造矩阵,



这里三个操作可以合并的,也就是不用每次都构造一个新的矩阵,具体见代码

#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <algorithm>
#include <math.h> using namespace std;
typedef long long int LL;
int n,k;
LL mod;
struct Node
{
LL a[105][105];
};
char m[10];
Node mutiply(Node a,Node b)
{
Node c;
memset(c.a,0,sizeof(c.a));
for(int i=1;i<=n+1;i++)
{
for(int j=1;j<=n+1;j++)
{
if(!a.a[i][j]) continue;
for(int k=1;k<=n+1;k++)
c.a[i][k]+=a.a[i][j]*b.a[j][k];
}
}
return c;
}
Node get(Node a,LL x)
{
Node c;
memset(c.a,0,sizeof(c.a));
for(int i=1;i<=n+1;i++)
c.a[i][i]=1;
for(x;x;x>>=1)
{
if(x&1) c=mutiply(c,a);
a=mutiply(a,a);
}
return c;
}
int main()
{
int x;int y;
while(scanf("%d%lld%d",&n,&mod,&k)!=EOF)
{
if(n==0&&mod==0&&k==0)
break;
Node a;
memset(a.a,0,sizeof(a.a));
for(int i=1;i<=n+1;i++)
a.a[i][i]=1;
for(int i=1;i<=k;i++)
{ scanf("%s",m);
if(m[0]=='g')
{
scanf("%d",&x);
a.a[x][n+1]++;
}
else if(m[0]=='e')
{
scanf("%d",&x);
for(int j=1;j<=n+1;j++)
a.a[x][j]=0;
}
else if(m[0]=='s')
{
scanf("%d%d",&x,&y);
for(int j=1;j<=n+1;j++)
swap(a.a[x][j],a.a[y][j]);
}
}
a=get(a,mod);
Node c;
memset(c.a,0,sizeof(c.a));
c.a[n+1][1]=1;
a=mutiply(a,c);
for(int i=1;i<=n;i++)
printf("%lld ",a.a[i][1]);
printf("\n");
}
return 0;
}

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

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

    题目链接 题意:有n个猫,开始的时候每个猫都没有坚果,进行k次操作,g x表示给第x个猫一个坚果,e x表示第x个猫吃掉所有坚果,s x y表示第x个猫和第y个猫交换所有坚果,将k次操作重复进行m轮, ...

  2. POJ 3735 Training little cats<矩阵快速幂/稀疏矩阵的优化>

    Training little cats Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 13488   Accepted:  ...

  3. POJ 3735 Training little cats 矩阵快速幂

    http://poj.org/problem?id=3735 给定一串操作,要这个操作连续执行m次后,最后剩下的值. 记矩阵T为一次操作后的值,那么T^m就是执行m次的值了.(其实这个还不太理解,但是 ...

  4. poj 3753 Training little cats_矩阵快速幂

    题意: 通过各种操作进行,给第i只猫花生,第i只猫吃光花生,第i只猫和第j只猫互换花生,问n次循环操作后结果是什么 很明显是构建个矩阵,然后矩阵相乘就好了 #include <iostream& ...

  5. 矩阵快速幂 POJ 3735 Training little cats

    题目传送门 /* 题意:k次操作,g:i猫+1, e:i猫eat,s:swap 矩阵快速幂:写个转置矩阵,将k次操作写在第0行,定义A = {1,0, 0, 0...}除了第一个外其他是猫的初始值 自 ...

  6. poj 2888 Magic Bracelet(Polya+矩阵快速幂)

    Magic Bracelet Time Limit: 2000MS   Memory Limit: 131072K Total Submissions: 4990   Accepted: 1610 D ...

  7. poj 3735 Training little cats(矩阵快速幂,模版更权威,这题数据很坑)

    题目 矩阵快速幂,这里的模版就是计算A^n的,A为矩阵. 之前的矩阵快速幂貌似还是个更通用一些. 下面的题目解释来自 我只想做一个努力的人 @@@请注意 ,单位矩阵最初构造 行和列都要是(猫咪数+1) ...

  8. Training little cats_矩阵快速幂

    Description Facer's pet cat just gave birth to a brood of little cats. Having considered the health ...

  9. POJ 3233 Matrix Power Series 矩阵快速幂+二分求和

    矩阵快速幂,请参照模板 http://www.cnblogs.com/pach/p/5978475.html 直接sum=A+A2+A3...+Ak这样累加肯定会超时,但是 sum=A+A2+...+ ...

  10. POJ 3233 Matrix Power Series 矩阵快速幂

    设S[k] = A + A^2 +````+A^k. 设矩阵T = A[1] 0 E E 这里的E为n*n单位方阵,0为n*n方阵 令A[k] = A ^ k 矩阵B[k] = A[k+1] S[k] ...

随机推荐

  1. OC06 -- 字典

    一. 创建不可变字典的方式: //字典的字面量,前key后value NSDictionary *dic =@{@"1":@"2",@"3" ...

  2. 封装locaostorage

    const ls = localStorage export default { setItem(name, value) { ls.setItem(name, JSON.stringify(valu ...

  3. ubuntu 15.04

    修改更新源: sudo vim /etc/apt/sources.list 删除里面所有内容 方法1: 按ggdG 方法2: :%d 替换源 搜狐源: deb http://mirrors.sohu. ...

  4. hive优化总结

    一.表设计 合理分表 合理设计表分区,静态分区.动态分区 二.扫描相关 1.谓词下推(Predicate Push Down) 2.列裁剪(Column Pruning) 在读数据的时候,只关心感兴趣 ...

  5. imx6 socketcan 发送问题

    参考cansend 的方法进行发送can 数据. cansend 的生成,请查考:http://www.cnblogs.com/chenfulin5/p/6797756.html cansend 代码 ...

  6. zend stdio 快捷键

    1.快速跳转到当前所指的函数.变量.方法.类的定义处 F3或者 ctrl+鼠标左键2.ctrl+m 编辑窗口最大化3.ctrl+d 删除当前行4.ctrl+q 定位到最后编辑的地方(全局的)5.ctr ...

  7. OGNL(Object-Graph Navigation Language),可以方便地操作对象属性的开源表达式语言,使页面更简洁;

    OGNL(Object-Graph Navigation Language),可以方便地操作对象属性的开源表达式语言,使页面更简洁: 支持运算符(如+-*/),比普通的标志具有更高的自由度和更强的功能 ...

  8. cx_Freeze的生成可执行文件

    ①.生成setup.py文件,仿照cx_Freeze给的例子 ②.python setup.py build 生成单个的可执行,会自动带着需要的动态链接库的.默认路径:build\bdist.win3 ...

  9. MyBatis 3.2.6插入时候获取自增主键方法

    MyBatis 3.2.6插入时候获取自增主键方法有二 以MySQL5.5为例: 方法1: <insert id="insert" parameterType="P ...

  10. jQuery的end()方法使用详解

    end()方法的定义和用法: end()方法能够回到最近的一个"破坏性"操作之前,即将匹配的元素列表变为前一次的状态.如果没有破坏性操作将返回一个空集.破坏性操作的概念:指任何改变 ...