POJ 3735 Training little cats(矩阵乘法)
【题目链接】 http://poj.org/problem?id=3735
【题目大意】
有一排小猫,给出一系列操作,包括给一只猫一颗花生,
让某只猫吃完所有的花生以及交换两只猫的花生,
求完成m次操作集合之后每只猫的花生数量
【题解】
创建一个1*(n+1)的初始矩阵,
对于给第i只猫一个花生就相当于乘上修改了A[0][i]的单位矩阵
如给第一只猫一个花生就修改A[0][1]为1
得到:
1 1 0 0
0 1 0 0
0 0 1 0
0 0 0 1
然后我们用初始矩阵去乘这个矩阵,就完成了加的操作
对于让第i只猫吃完所有的花生,我们将A[i][i]修改为0
如让第三只猫吃完花生,那么就相当于将A[3][3]改为0
得到
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 0
然后我们用初始矩阵去乘这个矩阵,就完成了清零的操作
对于交换花生的操作,我们交换单位矩阵的第x和y行,然后相乘即可
比如交换第一只猫和第三只猫的花生,我们就得到
1 0 0 0
0 0 0 1
0 0 1 0
0 1 0 0
乘到初始矩阵上即可
我们发现经过这些操作,我们最后会得到一个操作集合的矩阵表达
而这些操作的变换其实不用整个乘上矩阵,只要直接修改单位矩阵的部分值即可
第一种操作的影响可以转化为A[0][x]++
第二种操作的影响可以转化为A[0~n][x]=0
第三种操作的影响可以转化为i_0^n swap(A[i][x],A[i][y])
那么我们直接计算转置矩阵即可。
【代码】
#include <cstdio>
#include <vector>
#define rep(i,n) for(int i=0;i<n;i++)
using namespace std;
typedef long long LL;
typedef vector<vector<LL> > mat;
LL n,m,k,x,y;
char op[10];
mat mul(mat &A,mat &B){
mat C(A.size(),vector<LL>(B[0].size()));
rep(i,A.size())rep(k,B.size())if(A[i][k]){
rep(j,B[0].size())C[i][j]+=A[i][k]*B[k][j];
}return C;
}
mat pow(mat A,LL n){
mat B(A.size(),vector<LL>(A.size()));
rep(i,A.size())B[i][i]=1;
for(;n;n>>=1){if(n&1)B=mul(B,A);A=mul(A,A);}
return B;
}
int main(){
while(scanf("%lld%lld%lld",&n,&m,&k),n+m+k){
mat A(n+1,vector<LL>(n+1));
rep(i,n+1)A[i][i]=1;
while(k--){
scanf("%s",&op);
if(op[0]=='g'){
scanf("%lld",&x);
A[0][x]++;
}else if(op[0]=='e'){
scanf("%lld",&x);
rep(i,n+1)A[i][x]=0;
}else{
scanf("%lld%lld",&x,&y);
rep(i,n+1)swap(A[i][x],A[i][y]);
}
}if(m){
A=pow(A,m);
printf("%lld",A[0][1]);
for(int i=2;i<=n;i++)printf(" %lld",A[0][i]);
puts("");
}else{
printf("0");
rep(i,n-1)printf(" 0");
puts("");
}
}return 0;
}
POJ 3735 Training little cats(矩阵乘法)的更多相关文章
- poj 3735 Training little cats 矩阵快速幂+稀疏矩阵乘法优化
题目链接 题意:有n个猫,开始的时候每个猫都没有坚果,进行k次操作,g x表示给第x个猫一个坚果,e x表示第x个猫吃掉所有坚果,s x y表示第x个猫和第y个猫交换所有坚果,将k次操作重复进行m轮, ...
- POJ 3735 Training little cats 矩阵快速幂
http://poj.org/problem?id=3735 给定一串操作,要这个操作连续执行m次后,最后剩下的值. 记矩阵T为一次操作后的值,那么T^m就是执行m次的值了.(其实这个还不太理解,但是 ...
- POJ 3735 Training little cats<矩阵快速幂/稀疏矩阵的优化>
Training little cats Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 13488 Accepted: ...
- 矩阵快速幂 POJ 3735 Training little cats
题目传送门 /* 题意:k次操作,g:i猫+1, e:i猫eat,s:swap 矩阵快速幂:写个转置矩阵,将k次操作写在第0行,定义A = {1,0, 0, 0...}除了第一个外其他是猫的初始值 自 ...
- [POJ 3735] Training little cats (结构矩阵、矩阵高速功率)
Training little cats Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9613 Accepted: 2 ...
- POJ 3735 Training little cats(矩阵快速幂)
Training little cats Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 11787 Accepted: 2892 ...
- poj 3735 Training little cats(矩阵快速幂,模版更权威,这题数据很坑)
题目 矩阵快速幂,这里的模版就是计算A^n的,A为矩阵. 之前的矩阵快速幂貌似还是个更通用一些. 下面的题目解释来自 我只想做一个努力的人 @@@请注意 ,单位矩阵最初构造 行和列都要是(猫咪数+1) ...
- POJ 3735 Training little cats
题意 维护一个向量, 有三种操作 将第\(i\)个数加1 将第\(i\)个数置0 交换第\(i\)个数和第\(j\)个数 Solution 矩阵乘法/快速幂 Implementation 我们将向量写 ...
- poj 3735 Training little cats(构造矩阵)
http://poj.org/problem?id=3735 大致题意: 有n仅仅猫,開始时每仅仅猫有花生0颗,现有一组操作,由以下三个中的k个操作组成: 1. g i 给i仅仅猫一颗花生米 2. e ...
随机推荐
- Python运算符及逻辑运算
基本运算符 运算符用于执行程序代码运算,会针对一个以上操作数项目来进行运算.例如:2+3,其操作数是2和3,而运算符则是“+”.在计算器语言中运算符大致可以分为5种类型:算术运算符.连接运算符.关系运 ...
- shell之iptables
这五个位置也被称为五个钩子函数(hook functions),也叫五个规则链. 1.PREROUTING (路由前) 2.INPUT (数据包流入口) 3.FORWARD (转发管卡) 4.OUTP ...
- restorator 运行后其他所有EXE文件都无法运行的解决方案
昨天要反编译一个EXE,用RESTORATOR来查看资源罗列情况,倒霉的事情发生了,所有EXE文件点右键后‘打开’都没有了,刚开始以为中度了,进安全模式看,发现文件都没有异常,并且在安全模式下问题照样 ...
- perf 的事件
perf的事件包括: 硬件事件:branch-instrctions / branch-miss / bus-cycles / cache-miss / cache-reference / cycle ...
- VMware 密匙
11.0版本 1F04Z-6D111-7Z029-AV0Q4-3AEH8 亲测可用
- Java设计模式中适配器模式的实现方法
在Java开发中,我们常常需要用到Java接口型模式中的适配器模式,那适配器设计模式到底是什么模式呢? 适配器模式(Adapter)就是把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹 ...
- log4j的各种类的配置
log4j看上去像是一种简单的,易配置的日志打印技术.但是实际使用的时候发现,还有各种很相似的日志技术.很多地方的配置一乱就不知道怎么对应了.所以应该把log4j的一切做个简单的分类记录. (一)ja ...
- h5 Visibility API总结
最近活动中的小游戏,有涉及页面隐藏或app后台运行时候,暂停游戏的功能,使用了h5的Visibility API,在此总结如下: 两个属性 document.hidden (Read only) 如果 ...
- uoj228:基础数据结构练习题
题意:http://uoj.ac/problem/228 sol :线段树开根操作 对于节点x,可以在max[x]-min[x]<=1时直接做,转化为区间减或区间覆盖 #include< ...
- Jquery不同版本共用的解决方案(插件编写)
最近在为某公司做企业内部UI库,经过研究分析和评审,决定基于Jquery开发,结合Bootstrap插件那简洁,优雅,高效的思想进行插件编写. 但是在编写的过程中遇到一个头疼的问题,就是正在编写的插件 ...