POJ3735
题目链接: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的更多相关文章
- [poj3735] Training little cats_矩乘快速幂
Training little cats poj-3735 题目大意:给你n个数,k个操作,将所有操作重复m次. 注释:三种操作,将第i个盒子+1,交换两个盒子中的个数,将一个盒子清空.$1\le m ...
- POJ3735 矩阵
题意:有n只猫咪,开始时每只猫咪有花生0颗,现有一组操作,由下面三个中的k个操作组成: 1. g i 给i只猫咪一颗花生米 2. e i 让第i只猫咪吃掉它拥有的所有花生米 ...
- Training little cats poj3735
Training little cats Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9299 Accepted: 2 ...
- 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 ...
- Training little cats(poj3735,矩阵快速幂)
Training little cats Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10737 Accepted: ...
- poj3735—Training little cats(特殊操作转化为矩阵操作)
题目链接:http://poj.org/problem?id=3735 题目意思: 调教猫咪:有n只饥渴的猫咪,现有一组羞耻连续操作,由k个操作组成,全部选自: 1. g i 给第i只猫咪一颗花生 2 ...
- POJ3735【矩阵快速幂】
逛了一圈...觉得这篇讲的比较清楚:传送门~ 简要概括: 1.线性代数的知识,单位矩阵的利用:(如果不知道单位矩阵的,先去补习一下线代,做几题行列式就会了): 2.然后构造好矩阵以后,直接做M次乘积运 ...
- [POJ3735]Training little cats
题目:Training little cats 链接:http://poj.org/problem?id=3735 分析: 1)将操作用矩阵表示出来,然后快速幂优化. 2)初始矩阵:$ \left[ ...
- ACM之路(18)—— 矩阵
矩阵是干什么的呢?一句话来说就是,知道相邻两个函数的递推关系和第一个数,让你递推到第n个数.显然,如果n很大,那么一个一个递推过去是会超时的.所以矩阵就是用来解决这种快速递推的问题的. 比方说斐波那契 ...
随机推荐
- eclipse 创建maven项目失败
问题描述: eclipse 初次创建maven项目报错 可能是maven-archetype-quickstart:1.1.jar 包失效了或者没有? 有人说把这个jar包放在maven本地仓库里 我 ...
- RxJava--Buffer,GroupBy 对比
Buffer 设定收集n个元素为一组,以下方代码为例,三个为一组,则当组满三个元素时,返回一次List数据 没组满三个元素时,如果调用onComplete,直接发送剩余元素,没调用onComplete ...
- idea jdk版本切换
为什么80%的码农都做不了架构师?>>> 打开file-peoject structure,或者 改完project后,点击models里面的sources 和dependenc ...
- PPT模板素材
http://588ku.com/sucai/0-dnum-0-54-0-1/
- 云时代 • 新契机:2017届中国SaaS产业大会圆满落幕
2017年5-6日,由拓普会展携手中国云体系产业创新战略联盟主办,江苏省企业信息化协会,浙江省企业信息化促进会,广东省首席信息官协会,CIO时代学院,IDC点评网协办以及上海市网购商会,中国信息化推进 ...
- ACM成长之路(干货) 我爱ACM,与君共勉
前几天在网上看到,转过来时刻督促一下自己. ACM队不是为了一场比赛而存在的,为的是队员的整体提高. 大学期间,ACM队队员必须要学好的课程有: l C/C++两种语言 l 高等数学 l 线性代数 l ...
- C++ 模板(template) 的定义
定义: 模板(template)是实现代码重用机制的一种工具,它可以实现类型参数化,把类型定义为参数(模板元编程),从而实现了真正的代码可重用性. 模板是用来批量生成功能和形式都几乎相同的代码的.编译 ...
- 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 ...
- YOLACT : 首个实时one-stage实例分割模型,29.8mAP/33.5fps | ICCV 2019
论文巧妙地基于one-stage目标检测算法提出实时实例分割算法YOLACT,整体的架构设计十分轻量,在速度和效果上面达到很好的trade-off. 来源:[晓飞的算法工程笔记] 公众号 论文: ...
- Polycarp and Div 3 CodeForces - 1005D
这个题目其实很简单,有很多的方法写,然后我还是不会写,感觉自己好菜, 我开始想的是dp,但是不知道怎么dp,看了网上题解,豁然开朗 dp[i] 表示前面i个数满足条件的数有多少,f[s]表示前缀和为s ...