[POJ3735]Training little cats
题目:Training little cats
链接:http://poj.org/problem?id=3735
分析:
1)将操作用矩阵表示出来,然后快速幂优化。
2)初始矩阵:$ \left[ \begin{array}{ccccc} 1 & a_1 & a_2 & ... & a_n \end{array} \right] $
构造一个$ (n+1)*(n+1) $ 的单位矩阵T。
得花生:将第0行中得到花生的那一列赋为1.
$ \left[ \begin{array}{cccccc} 1 & 0 & ... & [1] & ... & 0 \\ 0 & 1 & ... & 0 & ... & 0 \\ ... & ... & ... & ... & ... & ... \\ 0 & 0 & ... & 0 & ... & 1 \end{array} \right] $
吃花生:将第得到花生的那一行那一列的元素赋为0;
$ \left[ \begin{array}{cccccc} 1 & 0 & ... & 0 & ... & 0 \\ 0 & 1 & ... & 0 & ... & 0 \\ ... & ... & ... & ... & ... & ... \\ 0 & 0 & ... & [0] & ... & 0 \\ ... & ... & ... & ... & ... & ... \\ 0 & 0 & ... & 0 & ... & 1 \end{array} \right] $
交换花生:就是交换两行,就是初等行变化。
$ \left[ \begin{array}{cccccc} 1 & 0 & ... & 0 & ... & 0 \\ ... & ... & ... & ... & ... & ... \\ ... & ... & 0 & ... & [1] & ... \\ ... & ... & ... & ... & ... & ... \\ ... & ... & [1] & ... & 0 & ... \\ ... & ... & ... & ... & ... & ... \\ 0 & 0 & ... & 0 & ... & 1 \end{array} \right] $
3)T不停累乘操作矩阵,最后得到这一组的组操作矩阵。
4)快速幂求T^n,然后第一行就是答案。
5)注意longlong,虽然只有$10^9$次组操作,但每组操作都是100个得花生,还都给一只猫,就爆int了。
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
typedef long long LL;
struct Matrix{
int n;
LL a[][];
void init(int _n,int f,int p=,int pp=){
n=_n;
memset(a,,sizeof a);
if(f==-)return;
for(int i=;i<=n;++i)a[i][i]=;
if(f==)a[][p]=;
if(f==)a[p][p]=;
if(f==){
a[p][p]=a[pp][pp]=;
a[p][pp]=a[pp][p]=;
}
}
};
Matrix operator*(Matrix& A,Matrix& B){
Matrix C;C.init(A.n,-);
for(int k=,n=C.n;k<=n;++k)
for(int i=;i<=n;++i)if(A.a[i][k])
for(int j=;j<=n;++j)
C.a[i][j]+=A.a[i][k]*B.a[k][j];
return C;
}
Matrix operator^(Matrix A,int n){
Matrix Rt;Rt.init(A.n,);
for(;n;n>>=){
if(n&)Rt=Rt*A;
A=A*A;
}
return Rt;
}
int main(){
int n,m,k,p,pp;char ch[];
Matrix T,T1;
for(;scanf("%d%d%d",&n,&m,&k);){
if(n== && m== && k==)break;
T.init(n,);
for(int i=;i<=k;++i){
scanf("%s",ch);
switch(ch[]){
case 'g':scanf("%d",&p);T1.init(n,,p);break;
case 'e':scanf("%d",&p);T1.init(n,,p);break;
case 's':scanf("%d%d",&p,&pp);T1.init(n,,p,pp);
}
T=T*T1;
}
T=T^m;
for(int i=;i<=n;++i)printf("%lld ",T.a[][i]);
puts("");
}
return ;
}
6)可以直接把初始矩阵的效果叠加到T上面
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
typedef long long LL;
struct Matrix{
int n;
LL a[][];
void init(int _n,int f){
n=_n;
memset(a,,sizeof a);
if(f==-)return;
for(int i=;i<=n;++i)a[i][i]=;
}
};
Matrix operator*(Matrix& A,Matrix& B){
Matrix C;C.init(A.n,-);
for(int k=,n=C.n;k<=n;++k)
for(int i=;i<=n;++i)if(A.a[i][k])
for(int j=;j<=n;++j)
C.a[i][j]+=A.a[i][k]*B.a[k][j];
return C;
}
Matrix operator^(Matrix A,int n){
Matrix Rt;Rt.init(A.n,);
for(;n;n>>=){
if(n&)Rt=Rt*A;
A=A*A;
}
return Rt;
}
int main(){
int n,m,k,p,pp;char ch[];
Matrix T;
for(;scanf("%d%d%d",&n,&m,&k);){
if(n== && m== && k==)break;
T.init(n,);
for(int i=;i<=k;++i){
scanf("%s",ch);
switch(ch[]){
case 'g':scanf("%d",&p);++T.a[][p];break;
case 'e':scanf("%d",&p);
for(int i=;i<=n;++i)T.a[i][p]=;
break;
case 's':scanf("%d%d",&p,&pp);
for(int i=;i<=n;++i)swap(T.a[i][p],T.a[i][pp]);
}
}
T=T^m;
for(int i=;i<=n;++i)printf("%lld ",T.a[][i]);
puts("");
}
return ;
}
[POJ3735]Training little cats的更多相关文章
- 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 ...
- poj3735—Training little cats(特殊操作转化为矩阵操作)
题目链接:http://poj.org/problem?id=3735 题目意思: 调教猫咪:有n只饥渴的猫咪,现有一组羞耻连续操作,由k个操作组成,全部选自: 1. g i 给第i只猫咪一颗花生 2 ...
- Training little cats poj3735
Training little cats Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9299 Accepted: 2 ...
- Training little cats(poj3735,矩阵快速幂)
Training little cats Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10737 Accepted: ...
- [poj3735] Training little cats_矩乘快速幂
Training little cats poj-3735 题目大意:给你n个数,k个操作,将所有操作重复m次. 注释:三种操作,将第i个盒子+1,交换两个盒子中的个数,将一个盒子清空.$1\le m ...
- 矩阵快速幂 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: 13488 Accepted: ...
- POJ 3735 Training little cats(矩阵快速幂)
Training little cats Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 11787 Accepted: 2892 ...
随机推荐
- 阅读笔记05-架构师必备最全SQL优化方案(1)
一.优化的哲学 1.优化可能带来的问题? 优化不总是对一个单纯的环境进行,还很可能是一个复杂的已投产的系统: 优化手段本来就有很大的风险,只不过你没能力意识到和预见到: 任何的技术可以解决一个问题,但 ...
- 获取EasyUI日期输入框的值
var date = $('#PurDate').datebox('getValue');
- Node.js实战2:模块使用入门。
NodeJS有丰富的三方模块,借助这些模块,可以快速的开发各类应用.这使用Nodejs可以进行很便捷.快速的开发. 1.安装与加载模块内核.三方 使用npm可以搜索.安装.卸载模块. 例: 搜索模块 ...
- Reinforcement Learning for Self Organization and Power Control of Two-Tier Heterogeneous Networks
R. Amiri, M. A. Almasi, J. G. Andrews and H. Mehrpouyan, "Reinforcement Learning for Self Organ ...
- IDEA 中常用插件
怎么找到安装插件位置 Mybatis plugin 可以在mapper接口中和mapper的xml文件中来回跳转,就想接口跳到实现类那样简单. Lombok plugin 开发神器,可以简化你的实体类 ...
- python学习第六天运算符总结大全
python学习第六天运算符总结大全,玖乐网络(www.96net.com.cn)列出下面详细 1,算术运算符 + 加 - 减 *乘 / 除 % 求模 ** 乘方 // 取整除 - 返回商的整数部分 ...
- JVM(14)之 类加载机制
开发十年,就只剩下这套架构体系了! >>> 从本篇博文开始,我们就进入虚拟机类加载机制的学习了.那么什么是类加载呢?当我们写完一个Java类的时候,并不是直接就可以运行的,它还要 ...
- SELECT INTO - 从一个查询的结果中创建一个新表
SYNOPSIS SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ] * | expression [ AS output_name ] [ ...
- Vue-cli3 环境的搭建
Vue-cli3 环境的搭建 准备 浏览器插件:Vue.js devtools VsCode 和 VsCode 插件 WebStorm Nodejs vue-cli git 起飞 安装vue-cli3 ...
- Java虚拟机(JVM)与垃圾回收机制(GC)的详解
一.JVM结构 根据<java虚拟机规范>规定,JVM的基本结构一般如下图所示: 从左图可知,JVM主要包括四个部分: 1.类加载器(ClassLoader):在JVM启动时或者在类运行时 ...