TZOJ--5480: 孤衾易暖 // POJ--3735 Training little cats (矩阵快速幂)

5480: 孤衾易暖

时间限制(普通/Java):1000MS/3000MS     内存限制:65536KByte

描述

哇,好难,我要放弃了(扶我起来,我还能A

寒夜纵长,孤衾易暖,钟鼓渐清圆。

生活也许有些不如意的地方,但是没有什么是拥有一只猫不能解决的,我最喜欢苏格兰折耳猫。

现在我有n只小猫,我要训练这些猫去满足我奇奇怪怪的需求。

就是要让他们去得到鱼,这样他们才会快乐。刚开始他们是没有鱼的

我对这些猫有3种训练要求:

第一种要求为get x,意为让第x只猫咪得到一条;

第二种要求为eat x,意为让第x只猫咪吃掉它所有的鱼;

第三种要求为exchange x y,意为让第x只猫咪和第y只猫咪交换他们的鱼。

人们经常都是复读机,猫也不例外,你给他们设定某组操作,让他们重复就好了。

他们需要重复执行某组操作(含有k个要求)m次,求最后它们都有多少只鱼。

输入

输入包括多组样例,读到文件结尾。

输入的第一行为三个整数n,m,k,代表有n只猫,要重复的次数m和k个要求组成的操作。

接下来有k行,每一行都有一个训练方式(m≤1,000,000,000, n≤100, k≤100)。

输出

对于每个样例都在一行上输出n个数,代表每只猫有多少只鱼。

样例输入

3 1 6
get 1
get 2
get 2
exchange 1 2
get 3
eat 2

样例输出

2 0 1

提示

第一只猫得到1条鱼,第2只猫得到1条鱼,第2只猫得到1条鱼,交换1和2的鱼数。

第1只猫现在有2条鱼,第2只猫现在有1条鱼。第三只猫有一条鱼,然后第二只猫的鱼被吃完。

所以第1只猫现在有2条鱼,第2只猫现在有0条鱼,第三只猫有1条鱼。而且只有一次,故输出2 0 1。

题目来源

TOJ

题目链接:http://tzcoder.cn/acmhome/problemdetail.do?&method=showdetail&id=5480

http://poj.org/problem?id=3735

两个题目是一样的,只不过一个英文题面一个中文题目

按照题目要求构造出矩阵,重复的次数用矩阵快速幂计算

对于题目要求的三种操作,可以按照下面的方法构造矩阵

第一种要求为get x,意为让第x只猫咪得到一条;

即x的位置+1

第二种要求为eat x,意为让第x只猫咪吃掉它所有的鱼;

即x的位置归0

第三种要求为exchange x y,意为让第x只猫咪和第y只猫咪交换他们的鱼。

即swap(x,y)

#include <bits/stdc++.h>
using namespace std;
#define LL __int64
struct A{
	LL data[111][111];
	int n;
	void ini(int nn){//初始化全0矩阵
		n=nn;
		memset(data,0,sizeof(data));
	}
	void dw(int nn){//单位矩阵
		ini(nn);
		for(int i=0;i<=n;i++)data[i][i]=1;
	}
	A(){
		n=2;
		memset(data,0,sizeof(data));
	}
};
int n;
A operator* (A a,A b)//矩阵乘法,重载乘号
{
	A ans;
	for(int i=0;i<=n;i++)
    {
        for(int j=0;j<=n;j++)
        {
            if(a.data[i][j]==0)continue;
            for(int k=0;k<=n;k++)
            {
                ans.data[i][k]+=a.data[i][j]*b.data[j][k];

            }
        }
    }
	return ans;
}
A operator^ (A a,int k)//矩阵次幂
{
	A ans;
	ans.dw(n);
	while(k)
	{
		if(k&1)ans=ans*a;
		a=a*a;
		k>>=1;
	}
	return ans;
}
int main(){
	int m,k,x,y;
	A T;
	char ch[15];
	while(~scanf("%d%d%d",&n,&m,&k)){
		T.dw(n);
		while(k--){
			scanf("%s",ch);
			if(ch[0]==‘g‘){
				scanf("%d",&x);
				T.data[0][x]++;
			}
			else if(ch[0]==‘e‘){
				if(ch[1]==‘x‘){
					scanf("%d %d",&x,&y);
					for(int i=0;i<=n;i++){
						swap(T.data[i][x],T.data[i][y]);
					}
				}else {
					scanf("%d",&x);
					for(int i=0;i<=n;i++){
						T.data[i][x]=0;
					}
				}
			}
		}
		T=T^m;
		printf("%I64d",T.data[0][1]);
		for(int i=2;i<=n;i++){
			printf(" %I64d",T.data[0][i]);
		}
		puts("");
	}
}

  

原文地址:https://www.cnblogs.com/Anidlebrain/p/10060964.html

时间: 2024-10-11 07:11:43

TZOJ--5480: 孤衾易暖 // POJ--3735 Training little cats (矩阵快速幂)的相关文章

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

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

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,利用稀疏矩阵的

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

题目传送门 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 #inc

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

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