题目: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了。

  1. #include <iostream>
  2. #include <cstring>
  3. #include <cstdio>
  4. using namespace std;
  5. typedef long long LL;
  6. struct Matrix{
  7. int n;
  8. LL a[][];
  9. void init(int _n,int f,int p=,int pp=){
  10. n=_n;
  11. memset(a,,sizeof a);
  12. if(f==-)return;
  13. for(int i=;i<=n;++i)a[i][i]=;
  14. if(f==)a[][p]=;
  15. if(f==)a[p][p]=;
  16. if(f==){
  17. a[p][p]=a[pp][pp]=;
  18. a[p][pp]=a[pp][p]=;
  19. }
  20. }
  21. };
  22. Matrix operator*(Matrix& A,Matrix& B){
  23. Matrix C;C.init(A.n,-);
  24. for(int k=,n=C.n;k<=n;++k)
  25. for(int i=;i<=n;++i)if(A.a[i][k])
  26. for(int j=;j<=n;++j)
  27. C.a[i][j]+=A.a[i][k]*B.a[k][j];
  28. return C;
  29. }
  30. Matrix operator^(Matrix A,int n){
  31. Matrix Rt;Rt.init(A.n,);
  32. for(;n;n>>=){
  33. if(n&)Rt=Rt*A;
  34. A=A*A;
  35. }
  36. return Rt;
  37. }
  38. int main(){
  39. int n,m,k,p,pp;char ch[];
  40. Matrix T,T1;
  41. for(;scanf("%d%d%d",&n,&m,&k);){
  42. if(n== && m== && k==)break;
  43. T.init(n,);
  44. for(int i=;i<=k;++i){
  45. scanf("%s",ch);
  46. switch(ch[]){
  47. case 'g':scanf("%d",&p);T1.init(n,,p);break;
  48. case 'e':scanf("%d",&p);T1.init(n,,p);break;
  49. case 's':scanf("%d%d",&p,&pp);T1.init(n,,p,pp);
  50. }
  51. T=T*T1;
  52. }
  53. T=T^m;
  54. for(int i=;i<=n;++i)printf("%lld ",T.a[][i]);
  55. puts("");
  56. }
  57. return ;
  58. }

6)可以直接把初始矩阵的效果叠加到T上面

  1. #include <iostream>
  2. #include <cstring>
  3. #include <cstdio>
  4. using namespace std;
  5. typedef long long LL;
  6. struct Matrix{
  7. int n;
  8. LL a[][];
  9. void init(int _n,int f){
  10. n=_n;
  11. memset(a,,sizeof a);
  12. if(f==-)return;
  13. for(int i=;i<=n;++i)a[i][i]=;
  14. }
  15. };
  16. Matrix operator*(Matrix& A,Matrix& B){
  17. Matrix C;C.init(A.n,-);
  18. for(int k=,n=C.n;k<=n;++k)
  19. for(int i=;i<=n;++i)if(A.a[i][k])
  20. for(int j=;j<=n;++j)
  21. C.a[i][j]+=A.a[i][k]*B.a[k][j];
  22. return C;
  23. }
  24. Matrix operator^(Matrix A,int n){
  25. Matrix Rt;Rt.init(A.n,);
  26. for(;n;n>>=){
  27. if(n&)Rt=Rt*A;
  28. A=A*A;
  29. }
  30. return Rt;
  31. }
  32. int main(){
  33. int n,m,k,p,pp;char ch[];
  34. Matrix T;
  35. for(;scanf("%d%d%d",&n,&m,&k);){
  36. if(n== && m== && k==)break;
  37. T.init(n,);
  38. for(int i=;i<=k;++i){
  39. scanf("%s",ch);
  40. switch(ch[]){
  41. case 'g':scanf("%d",&p);++T.a[][p];break;
  42. case 'e':scanf("%d",&p);
  43. for(int i=;i<=n;++i)T.a[i][p]=;
  44. break;
  45. case 's':scanf("%d%d",&p,&pp);
  46. for(int i=;i<=n;++i)swap(T.a[i][p],T.a[i][pp]);
  47. }
  48. }
  49. T=T^m;
  50. for(int i=;i<=n;++i)printf("%lld ",T.a[][i]);
  51. puts("");
  52. }
  53. return ;
  54. }

[POJ3735]Training little cats的更多相关文章

  1. 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 ...

  2. poj3735—Training little cats(特殊操作转化为矩阵操作)

    题目链接:http://poj.org/problem?id=3735 题目意思: 调教猫咪:有n只饥渴的猫咪,现有一组羞耻连续操作,由k个操作组成,全部选自: 1. g i 给第i只猫咪一颗花生 2 ...

  3. Training little cats poj3735

    Training little cats Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9299   Accepted: 2 ...

  4. Training little cats(poj3735,矩阵快速幂)

    Training little cats Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10737   Accepted:  ...

  5. [poj3735] Training little cats_矩乘快速幂

    Training little cats poj-3735 题目大意:给你n个数,k个操作,将所有操作重复m次. 注释:三种操作,将第i个盒子+1,交换两个盒子中的个数,将一个盒子清空.$1\le m ...

  6. 矩阵快速幂 POJ 3735 Training little cats

    题目传送门 /* 题意:k次操作,g:i猫+1, e:i猫eat,s:swap 矩阵快速幂:写个转置矩阵,将k次操作写在第0行,定义A = {1,0, 0, 0...}除了第一个外其他是猫的初始值 自 ...

  7. [POJ 3735] Training little cats (结构矩阵、矩阵高速功率)

    Training little cats Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9613   Accepted: 2 ...

  8. POJ 3735 Training little cats<矩阵快速幂/稀疏矩阵的优化>

    Training little cats Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 13488   Accepted:  ...

  9. POJ 3735 Training little cats(矩阵快速幂)

    Training little cats Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 11787 Accepted: 2892 ...

随机推荐

  1. delphi idhttpsever

    http://blog.csdn.net/chelen_jak/article/details/50203809 delphi idhttpsever 2015-12-07 11:36 216人阅读  ...

  2. Bootstrap 学习笔记13 附加导航插件

    附加导航代码: <style> a:focus { outline: none; } .nav-pills { width: 150px; } .nav-pills.affix { top ...

  3. Mac009--Axure RP安装

    Mac--Axure RP安装 一.下载Axure RP8.0 下载网址:https://www.axure.com/download  (下载mac版本) Axure RP说明: Axure RP是 ...

  4. C#后台去除字符串最后一个字符

    string str = "a,b,c,"; int length = str.length; //获取字符串长度 str = str.substring(0,length-1); ...

  5. Django first()和last() F查询以及Q查询

    一.first()和last() 分别返回queryset的第一项与最后一项,具体用法如下: p = Blog.objects.order_by('title').first() 等同于: try: ...

  6. 安装go版本

    下载地址(官网):https://golang.org/dl/ 下载地址(国内):https://dl.gocn.io/ 想编译GO,必须先有一个GO的编译器. 创建GO的编译器:[root@node ...

  7. Linux-第二篇常用命令

    1.常用目录文件操作命令 cd:切换目录 格式:cd 目录 ls:显示文件和目录列表.可选参数: -l 列出文件的详细信息 -a 列出当前目录所有文件,包含隐藏文件 ll:查看目录接口,相当于是ls ...

  8. APM-全链路追踪

    1.故障快速定位 跨语言实现开发中在业务日志中添加调用链ID,可以通过调用链结合业务日志快速定位错误信息. 2.各个调用环节的性能分析 分析调用链的各个环节耗时,分析系统的性能瓶颈,找到系统的薄弱环节 ...

  9. 【Vue 2.X】基于ElementUI 实现 dialog弹窗移动效果-自定义指令系列(二)

    v-dialogDrag: 弹窗拖拽 使用: <el-dialog XXX v-dialogDrag></el-dialog> Vue.directive('dialogDra ...

  10. 贪心策略---买卖股票的最大收益 II

    买卖股票的最大收益 II 122. Best Time to Buy and Sell Stock II (Easy) 题目描述:   可以进行多次交易,多次交易之间不能交叉进行,可以进行多次交易. ...