题目链接: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. Netty随记之ChannelInboundHandlerAdapter、SimpleChannelInboundHandler

    ChannelInboundHandlerAdapter ChannelInboundHandlerAdapter是ChannelInboundHandler的一个简单实现,默认情况下不会做任何处理, ...

  2. pfSense®2.4.4发布后,原pfSense 黄金会员的服务将免费使用!

    2018年7月16日,Doug McIntire 从即将发布的pfSense®2.4.4开始,之前在"pfSense Gold"下提供的所有服务都将继续,但所有pfSense用户都 ...

  3. 第 43 章 Baidu Map

    43.1. BMap.Circle var point = new BMap.Point(22.111, 114.111); var styleCircleF = { strokeColor:&quo ...

  4. 数学--数论-- HDU6298 Maximum Multiple 打表找规律

    Given an integer nn, Chiaki would like to find three positive integers xx, yy and zzsuch that: n=x+y ...

  5. 数学--数论--HDU - 6322 打表找规律

    In number theory, Euler's totient function φ(n) counts the positive integers up to a given integer n ...

  6. Spring Boot Actuator H2 RCE复现

    0x00 前言 Spring Boot框架是最流行的基于Java的微服务框架之一,可帮助开发人员快速轻松地部署Java应用程序,加快开发过程.当Spring Boot Actuator配置不当可能造成 ...

  7. 使用Python+TensorFlow2构建基于卷积神经网络(CNN)的ECG心电信号识别分类(二)

    心律失常数据库 目前,国际上公认的标准数据库包含四个,分别为美国麻省理工学院提供的MIT-BIH(Massachusetts Institute of Technology-Beth Israel H ...

  8. JWT安全问题

    Json Web Tokens 在线工具网站:https://jwt.io/ python 用到的库 jwt  // pip install pyjwt JWTCrack key   // git c ...

  9. Java——多线程之线程间通信

    Java多线系列文章是Java多线程的详解介绍,对多线程还不熟悉的同学可以先去看一下我的这篇博客Java基础系列3:多线程超详细总结,这篇博客从宏观层面介绍了多线程的整体概况,接下来的几篇文章是对多线 ...

  10. Codeforces Round #626 D. Present

    D. Present 题目大意:给你一个大小是n的序列,求两两之间相加进行异或之后的答案. 这个题目我并没有想到怎么写,有点偷懒于是就去看了题解.. 题解很套路... 题解: 因为这个是用到了异或,所 ...