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

解题思路:

  先构造一个(n+1)*(n+1)的单位矩阵E,在此基础上进行操作:

  1、g i     ------------->      E[0][i] ++;

  2、s i j   ------------->  for(int k=0;k<=n;k++)  swap(E[k][i],E[k][j]);

  3、e i    ------------->  for(int k=0;k<=n;k++) E[k][i]=0;

  上面的这一个部分本来我是构造多个单位矩阵,在单位矩阵上进行操作的,操作后的矩阵相乘的结果就是总的操作,结果就是一个TLE。。。后来改成这样才AC了。

  然后再构造一个矩阵A,A只有左上角为1,其他的都为0。操作m次,其实就是A*(E^m)。矩阵快速幂,上!

AC代码:

 #include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn=;
struct Matrix{
ll mat[maxn][maxn];
};
Matrix Multiply(Matrix x,Matrix y,int n){
Matrix temp;
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
temp.mat[i][j]=;
for(int k=;k<=n;k++){
if(x.mat[i][k]&&y.mat[k][j]) //没有这个优化TLE
temp.mat[i][j]+=(x.mat[i][k]*y.mat[k][j]);
}
}
}
return temp;
}
Matrix Fast_Power(Matrix a,int m,int n){
Matrix res;
for(int i=;i<=n;i++){
for(int j=i;j<=n;j++){
if(i==j) res.mat[i][j]=;
else res.mat[i][j]=res.mat[j][i]=;
}
}
while(m){
if(m&) res=Multiply(res,a,n);
m>>=;
a=Multiply(a,a,n);
}
return res;
} int main(){
Matrix rt;
int n,m,k,a,b;
char t[];
while(scanf("%d%d%d",&n,&m,&k)==&&(n||m||k)){
for(int i=;i<=n;i++){
for(int j=i;j<=n;j++){
if(i==j) rt.mat[i][j]=;
else rt.mat[i][j]=rt.mat[j][i]=;
}
}//构造出一个(n+1)*(n+1)的单位矩阵
while(k--){
scanf("%s",t);
if(t[]=='g'){
scanf("%d",&a);
rt.mat[][a]++;
}
else if(t[]=='e'){
scanf("%d",&a);
for(int i=;i<=n;i++)
rt.mat[i][a]=;
}
else{
scanf("%d %d",&a,&b);
for(int i=;i<=n;i++){
if(rt.mat[i][a]||rt.mat[i][b])
swap(rt.mat[i][a],rt.mat[i][b]);
}
}
}
if(m==){
for(int i=;i<n;i++){
if(i!=) printf(" ");
printf("");
}
}
else{
Matrix t;
memset(t.mat,,sizeof(t));
t.mat[][]=;
Matrix ret=Multiply(t,Fast_Power(rt,m,n),n);
for(int i=;i<=n;i++){
if(i!=) printf(" ");
printf("%lld",ret.mat[][i]);
}
}
printf("\n");
}
return ;
}

POJ3735的更多相关文章

  1. [poj3735] Training little cats_矩乘快速幂

    Training little cats poj-3735 题目大意:给你n个数,k个操作,将所有操作重复m次. 注释:三种操作,将第i个盒子+1,交换两个盒子中的个数,将一个盒子清空.$1\le m ...

  2. POJ3735 矩阵

    题意:有n只猫咪,开始时每只猫咪有花生0颗,现有一组操作,由下面三个中的k个操作组成:        1. g i 给i只猫咪一颗花生米        2. e i 让第i只猫咪吃掉它拥有的所有花生米 ...

  3. Training little cats poj3735

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

  4. xiaowuga poj3735—Training little cats(特殊操作转化为矩阵操作)

    题意:有n只猫,对其进行k次操作,然后反复这样操作m次. 其中g 表示 i 猫加1, e表示 i 猫为0:s表示  i 与 j 猫互换. 解释一下样例: 3 1 6g 1g 2g 2s 1 2g 3e ...

  5. Training little cats(poj3735,矩阵快速幂)

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

  6. poj3735—Training little cats(特殊操作转化为矩阵操作)

    题目链接:http://poj.org/problem?id=3735 题目意思: 调教猫咪:有n只饥渴的猫咪,现有一组羞耻连续操作,由k个操作组成,全部选自: 1. g i 给第i只猫咪一颗花生 2 ...

  7. POJ3735【矩阵快速幂】

    逛了一圈...觉得这篇讲的比较清楚:传送门~ 简要概括: 1.线性代数的知识,单位矩阵的利用:(如果不知道单位矩阵的,先去补习一下线代,做几题行列式就会了): 2.然后构造好矩阵以后,直接做M次乘积运 ...

  8. [POJ3735]Training little cats

    题目:Training little cats 链接:http://poj.org/problem?id=3735 分析: 1)将操作用矩阵表示出来,然后快速幂优化. 2)初始矩阵:$ \left[ ...

  9. ACM之路(18)—— 矩阵

    矩阵是干什么的呢?一句话来说就是,知道相邻两个函数的递推关系和第一个数,让你递推到第n个数.显然,如果n很大,那么一个一个递推过去是会超时的.所以矩阵就是用来解决这种快速递推的问题的. 比方说斐波那契 ...

随机推荐

  1. eclipse 创建maven项目失败

    问题描述: eclipse 初次创建maven项目报错 可能是maven-archetype-quickstart:1.1.jar 包失效了或者没有? 有人说把这个jar包放在maven本地仓库里 我 ...

  2. RxJava--Buffer,GroupBy 对比

    Buffer 设定收集n个元素为一组,以下方代码为例,三个为一组,则当组满三个元素时,返回一次List数据 没组满三个元素时,如果调用onComplete,直接发送剩余元素,没调用onComplete ...

  3. idea jdk版本切换

    为什么80%的码农都做不了架构师?>>>   打开file-peoject structure,或者 改完project后,点击models里面的sources 和dependenc ...

  4. PPT模板素材

    http://588ku.com/sucai/0-dnum-0-54-0-1/

  5. 云时代 • 新契机:2017届中国SaaS产业大会圆满落幕

    2017年5-6日,由拓普会展携手中国云体系产业创新战略联盟主办,江苏省企业信息化协会,浙江省企业信息化促进会,广东省首席信息官协会,CIO时代学院,IDC点评网协办以及上海市网购商会,中国信息化推进 ...

  6. ACM成长之路(干货) 我爱ACM,与君共勉

    前几天在网上看到,转过来时刻督促一下自己. ACM队不是为了一场比赛而存在的,为的是队员的整体提高. 大学期间,ACM队队员必须要学好的课程有: l C/C++两种语言 l 高等数学 l 线性代数 l ...

  7. C++ 模板(template) 的定义

    定义: 模板(template)是实现代码重用机制的一种工具,它可以实现类型参数化,把类型定义为参数(模板元编程),从而实现了真正的代码可重用性. 模板是用来批量生成功能和形式都几乎相同的代码的.编译 ...

  8. three.js中的矩阵变换(模型视图投影变换)

    目录 1. 概述 2. 基本变换 2.1. 矩阵运算 2.2. 模型变换矩阵 2.2.1. 平移矩阵 2.2.2. 旋转矩阵 2.2.2.1. 绕X轴旋转矩阵 2.2.2.2. 绕Y轴旋转矩阵 2.2 ...

  9. YOLACT : 首个实时one-stage实例分割模型,29.8mAP/33.5fps | ICCV 2019

    论文巧妙地基于one-stage目标检测算法提出实时实例分割算法YOLACT,整体的架构设计十分轻量,在速度和效果上面达到很好的trade-off.   来源:[晓飞的算法工程笔记] 公众号 论文: ...

  10. Polycarp and Div 3 CodeForces - 1005D

    这个题目其实很简单,有很多的方法写,然后我还是不会写,感觉自己好菜, 我开始想的是dp,但是不知道怎么dp,看了网上题解,豁然开朗 dp[i] 表示前面i个数满足条件的数有多少,f[s]表示前缀和为s ...