码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-02-19 09:36:57      阅读:190      评论:0      收藏:0      [点我收藏+]

标签:poj   矩阵快速幂   


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

PKU Campus 2009 (POJ Monthly Contest – 2009.05.17), Facer

题目链接:http://poj.org/problem?id=3735

题目大意:n只猫,k个序列
g i表示第i只猫得到一个花生
e i表示第i只猫吃掉所有花生
s i j表示第i只猫和第j只猫交换花生
k个序列要被重复m次,问最后每只猫有多少花生

题目分析:典型的矩阵快速幂问题,先构造单位矩阵
g i:   1   0   0   0    让第n+1列第i行加1 如若i = 1      1   0   0   1       x        x + 1
        0   1   0   0                                                         0   1   0   0       y   =     y
        0   0   1   0                                                         0   0   1   0       z          z
        0   0   0   1                                                         0   0   0   1       1          1

e i:    将矩阵第i行全部清0即可

s i j:交换当前矩阵的第i行和第j行即可

矩阵求出来,再走一个快速幂就好了


#include <cstdio>
#include <cstring>
#define ll long long
struct matrix
{
    ll m[105][105];
}a;

int n, k;
ll m;

matrix multiply(matrix x, matrix y)    
{    
    matrix ans;    
    memset(ans.m, 0, sizeof(ans.m));    
    for(int i = 1; i <= n; i++)    
        for(int j = 1; j <= n; j++)    
            if(x.m[i][j])    
                for(int k = 1; k <= n; k++)    
                    ans.m[i][k] = (ans.m[i][k] + x.m[i][j] * y.m[j][k]);    
    return ans;    
}  

matrix quickmod(int p)    
{    
    matrix ans;    
    memset(ans.m, 0, sizeof(ans.m));    
    for(int i = 1; i <= n; i++)    
        ans.m[i][i] = 1;    
    while(p)    
    {    
        if(p & 1)    
            ans = multiply(ans, a);    
        p >>= 1;    
        a = multiply(a, a);    
    }    
    return ans;    
}  

int main()
{
    while(scanf("%d %lld %d", &n, &m, &k) != EOF && (n + m + k))
    {
        n++;
        char s[10];
        int x, y;
        memset(a.m, 0, sizeof(a.m));
        for(int i = 1; i <= n; i++)
            a.m[i][i] = 1;
        for(int i = 0; i < k; i++)
        {
            scanf("%s", s);
            if(s[0] == 'g')
            {
                scanf("%d", &x);
                a.m[x][n]++;
            }
            if(s[0] == 'e')
            {
                scanf("%d", &x);
                for(int j = 1; j <= n; j++)
                    a.m[x][j] = 0;
            }
            if(s[0] == 's')
            {
                scanf("%d %d", &x, &y);
                for(int j = 1; j <= n; j++)
                {
                    ll tmp = a.m[x][j];
                    a.m[x][j] = a.m[y][j];
                    a.m[y][j] = tmp;
                }
            }
        }
        matrix ans = quickmod(m);
        for(int i = 1; i < n; i++)
            printf("%lld ", ans.m[i][n]);
        printf("\n");
    }
} 




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

标签:poj   矩阵快速幂   

原文地址:http://blog.csdn.net/tc_to_top/article/details/43882281

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!