前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >POJ 3735 Training little cats(矩阵快速幂)

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

作者头像
ShenduCC
发布2018-04-26 16:22:43
7310
发布2018-04-26 16:22:43
举报
文章被收录于专栏:算法修养

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

这个也是构造矩阵,

这里写图片描述
这里写图片描述

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

代码语言:javascript
复制
#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;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-04-20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档