题目链接: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. js 函数对象的继承 inherit 带 插件完整解析版[helpers.js]

    前言:         本人纯小白一个,有很多地方理解的没有各位大牛那么透彻,如有错误,请各位大牛指出斧正!小弟感激不尽.         本篇文章为您分析一下原生JS的对象继承方法 需求分析: 1. ...

  2. 数学--数论--HDU1792A New Change Problem(GCD规律推导)

    A New Change Problem Problem Description Now given two kinds of coins A and B,which satisfy that GCD ...

  3. postman(环境设置)

    1.点击小齿轮进入到环境变量添加页面,点击add添加环境变量 2.新增环境输入变量名称和变量值 3.添加成功 4.接口中设置变量,切换环境进行传参 5.调用环境变量断言 调用环境变量中的phone变量 ...

  4. 安卓commandlinetools-win-6200805_latest配置

    JDK:1.8.0_251 系统:win10 64bit 问题1 官网下载commandlinetools,解压运行报错 解决方法 打开sdkmanager.bat,修改第17行为set DEFAUL ...

  5. 用纯css、JavaScript、jQuery简单的轮播图

    完成一个可以自动切换或点击数字的轮播图 HTML代码只需要一个div 包含着一个图片和一个列表,我们主要的思路就是通过点击相应的数字,改变图片的 路径. 有4张图片都在img文件夹里,名称为  img ...

  6. 支付宝小程序云开发(Serverless)

    支付宝小程序云开发(Serverless) 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 一.在支付宝账号里面开通小程序云服务 ...

  7. P1191 矩形

    ------------恢复内容开始------------ 题意 给出一个\(n*n\)的矩阵,矩阵中,有些格子被染成白色,有些格子被染成黑色,现要求矩阵中白色矩形的数量 分割线 Ⅰ.暴力出奇迹!! ...

  8. LTE基站开局流程

    1.全局参数配置 MOD  ENODEB :修改基站 ADD  CNOPERATOR: 添加运营商 ADD  CNOPERATORTA:添加跟踪区(TA) 2.设备参数配置(机柜.机框.RRU.光纤链 ...

  9. STM32 Cube之旅-尝试新的开发方式

    尝试使用Cube进行一些开发学习,这里对此做一个梗概,先有一个全面的了解. 文章目录 Cube全家桶 CubeMX CubeIDE CubeProg 结语 Cube全家桶 曾几何时,ST刚推出Cube ...

  10. 使用Optional,不再头疼NPE

    前言 在 Java 语言开发中,可能大多数程序员遇到最多的异常就是 NullPointException 空指针异常了.这个当初语言的开发者"仅仅因为这样实现起来更容易"而允许空引 ...