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

大致题意:

有n仅仅猫,開始时每仅仅猫有花生0颗,现有一组操作,由以下三个中的k个操作组成:

1. g i 给i仅仅猫一颗花生米

2. e i 让第i仅仅猫吃掉它拥有的全部花生米

3. s i j 将猫i与猫j的拥有的花生米交换

现将上述一组操作循环m次后,问每仅仅猫有多少颗花生?

非常明显,要先构造矩阵。构造一个(n+1)*(n+1)的矩阵a,初始化为单位矩阵。

g i : a[i][n+1] += 1;

e i : a[i][j] = 0;(1 <= j <= n+1)

s i j : swap(a[i][k],a[j][k])(1 <= k <= n+1)

然后矩阵高速幂就ok了。

注意m非常大,k也不小,要用long long .

#include <stdio.h>
#include <iostream>
#include <map>
#include <set>
#include <list>
#include <stack>
#include <vector>
#include <math.h>
#include <string.h>
#include <queue>
#include <string>
#include <stdlib.h>
#include <algorithm>
#define LL long long
#define _LL __int64
#define eps 1e-12
#define PI acos(-1.0)
#define C 240
#define S 20
using namespace std;
const int maxn = 110;
int n,m,k; struct matrix
{
LL mat[maxn][maxn];
void init()
{
memset(mat,0,sizeof(mat));
for(int i = 1; i <= n+1; i++)
mat[i][i] = 1;
}
}a,b; matrix mul(matrix a, matrix b)
{
matrix ans;
memset(ans.mat,0,sizeof(ans.mat));
for(int i = 1; i <= n+1; i++)
{
for(int k = 1; k <= n+1; k++)
{
if(a.mat[i][k] == 0) continue;
for(int j = 1; j <= n+1; j++)
ans.mat[i][j] += a.mat[i][k] * b.mat[k][j];
}
}
return ans;
} matrix pow(matrix a, int nn)
{
matrix ans;
ans.init();
while(nn)
{
if(nn&1)
ans = mul(ans,a);
a = mul(a,a);
nn >>= 1;
}
return ans;
} int main()
{
char ch[3];
int x,y;
while(~scanf("%d %d %d",&n,&m,&k))
{
if(n == 0 && m == 0 && k == 0) break;
a.init();
memset(b.mat,0,sizeof(b.mat));
b.mat[n+1][1] = 1;
while(k--)
{
scanf("%s",ch);
if(ch[0] == 'g')
{
scanf("%d",&x);
a.mat[x][n+1] += 1;
}
else if(ch[0] == 'e')
{
scanf("%d",&x);
for(int i = 1; i <= n+1; i++)
a.mat[x][i] = 0;
}
else
{
scanf("%d %d",&x,&y);
for(int i = 1; i <= n+1; i++)
swap(a.mat[x][i],a.mat[y][i]);
}
}
a = pow(a,m);
matrix ans = mul(a,b);
for(int i = 1; i <= n; i++)
{
printf("%lld",ans.mat[i][1]);
if(i == n) printf("\n");
else printf(" ");
}
}
return 0; }

poj 3735 Training little cats(构造矩阵)的更多相关文章

  1. [POJ 3735] Training little cats (结构矩阵、矩阵高速功率)

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

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

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

  3. POJ 3735 Training little cats(矩阵乘法)

    [题目链接] http://poj.org/problem?id=3735 [题目大意] 有一排小猫,给出一系列操作,包括给一只猫一颗花生, 让某只猫吃完所有的花生以及交换两只猫的花生, 求完成m次操 ...

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

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

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

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

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

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

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

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

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

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

  9. POJ 3735 Training little cats

    题意 维护一个向量, 有三种操作 将第\(i\)个数加1 将第\(i\)个数置0 交换第\(i\)个数和第\(j\)个数 Solution 矩阵乘法/快速幂 Implementation 我们将向量写 ...

随机推荐

  1. 亚马逊AWS免费套餐EC2安装centos连接登录并创建root

    前言:刚开始使用亚马逊的AWS的免费套餐EC2,由于个人习惯使用centos系统,所以果断安装,但是AWS为了安全性,默认禁止用户使用root账户,导致安装配置环境各种问题.所以我把从安好系统后遇到的 ...

  2. 2013年度最新最佳CSS网页设计实例

    CSS在网页设计中扮演着举足轻重的角色,尤其是CSS3和HTML5的出现,让我们更加相信CSS能给我们带来无限的遐想和强有力的视觉冲击.今天我要给大家推荐几个最新CSS佳作,虽然本人没有设计头脑,但还 ...

  3. 全局 Style

    1.定义一个全局资源文件,如下 <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/pres ...

  4. 在Linux上自动调整屏幕亮度保护眼睛

    导读 Lightbot当你开始在计算机前花费大量时间的时候,问题自然开始显现.这健康吗?怎样才能舒缓我眼睛的压力呢?为什么光线灼烧着我?尽管解答这些问题的研究仍然在不断进行着,许多程序员已经采用了一些 ...

  5. debug输出rect,size和point的宏

    #define NSLogRect(rect) NSLog(@"%s x:%.4f, y:%.4f, w:%.4f, h:%.4f", #rect, rect.origin.x,  ...

  6. mac利用Synergy操作多台电脑

    话说,我现在桌子上有3台电脑,但是我只有一个鼠标和键盘,我该怎么玩呢,就像win一样,可以外接一个显示器,鼠标到达了显示器边缘自动翻越到另一个显示器上,这个没问题,win已经实现了. 我今天推荐一款牛 ...

  7. 整理两个PetaPoco连接SQLite数据库的方法

    从https://github.com/qingask/PetaPoco.NetCore下载源文件压缩包 解压出文件PetaPoco.Multiple.cs.PetaPoco.NetCore.cs 放 ...

  8. NodeBB,一个基于nodejs的响应式论坛

    喜欢方便的同学请绕道去discuz,好吧我是nodejs的重视患者,首先你要有自己的vps或则云空间,比如9cloud,我今天用的是阿里云的VPS. 进入阿里云Ubuntu主机 .... 输入密码进入 ...

  9. 帝吧fb出征是什么原因?帝吧fb出征事情始末 帝吧出征FB打“台独” 台湾网民崩溃:巨人之墙爆了

    帝吧出征FB打"台独" 台湾网民崩溃:巨人之墙爆了 发表时间:2016-01-20 21:08:10 字号:A-AA+ 关键字: 帝吧帝吧出征FB帝吧出征FB打台独台独脸书巨人之墙 ...

  10. WPF 同一个程序 只允许 同时运行一个

            方法2  当程序已经运行了 再运行这个程序时,则显示当前这个窗体  http://code.3rbang.com/cshape-run-one/ VS2013附件:http://fil ...