[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 ...
随机推荐
- delphi idhttpsever
http://blog.csdn.net/chelen_jak/article/details/50203809 delphi idhttpsever 2015-12-07 11:36 216人阅读 ...
- Bootstrap 学习笔记13 附加导航插件
附加导航代码: <style> a:focus { outline: none; } .nav-pills { width: 150px; } .nav-pills.affix { top ...
- Mac009--Axure RP安装
Mac--Axure RP安装 一.下载Axure RP8.0 下载网址:https://www.axure.com/download (下载mac版本) Axure RP说明: Axure RP是 ...
- C#后台去除字符串最后一个字符
string str = "a,b,c,"; int length = str.length; //获取字符串长度 str = str.substring(0,length-1); ...
- Django first()和last() F查询以及Q查询
一.first()和last() 分别返回queryset的第一项与最后一项,具体用法如下: p = Blog.objects.order_by('title').first() 等同于: try: ...
- 安装go版本
下载地址(官网):https://golang.org/dl/ 下载地址(国内):https://dl.gocn.io/ 想编译GO,必须先有一个GO的编译器. 创建GO的编译器:[root@node ...
- Linux-第二篇常用命令
1.常用目录文件操作命令 cd:切换目录 格式:cd 目录 ls:显示文件和目录列表.可选参数: -l 列出文件的详细信息 -a 列出当前目录所有文件,包含隐藏文件 ll:查看目录接口,相当于是ls ...
- APM-全链路追踪
1.故障快速定位 跨语言实现开发中在业务日志中添加调用链ID,可以通过调用链结合业务日志快速定位错误信息. 2.各个调用环节的性能分析 分析调用链的各个环节耗时,分析系统的性能瓶颈,找到系统的薄弱环节 ...
- 【Vue 2.X】基于ElementUI 实现 dialog弹窗移动效果-自定义指令系列(二)
v-dialogDrag: 弹窗拖拽 使用: <el-dialog XXX v-dialogDrag></el-dialog> Vue.directive('dialogDra ...
- 贪心策略---买卖股票的最大收益 II
买卖股票的最大收益 II 122. Best Time to Buy and Sell Stock II (Easy) 题目描述: 可以进行多次交易,多次交易之间不能交叉进行,可以进行多次交易. ...